Возвращаемое значение в последней цитате в php

#php #regex

#php #регулярное выражение

Вопрос:

Как бы я мог вернуть последнее значение внутри кавычек строки ниже, используя PHP. В этом случае значение равно 200, но оно динамическое?

  {"amount_id_341":"200"}
 

Комментарии:

1. Вы хотите проанализировать строку JSON?

2. Я вижу, что это JSON, но я не буду знать значение id, поэтому мне нужно будет проанализировать всю строку, не зная значения id.

Ответ №1:

Ну, это тоже JSON, поэтому вы можете преобразовать его в массив PHP и получить значение таким образом:

 $json = json_decode('{"amount_id_341":"200"}', true);
echo $json['amount_id_341'];
 

Логическое значение заключается в преобразовании его в ассоциативный массив вместо объекта, с которым мне легче работать в PHP.

В случае, если вы не знаете имя свойства, вы можете использовать array_values :

 $json = json_decode('{"amount_id_341":"200"}', true);
$vals = array_values($json);
echo $vals[0];
 

Или array_pop , как Патрик, упомянутый в комментариях:

 $json = json_decode('{"amount_id_341":"200"}', true);
echo array_pop($json);
 

Комментарии:

1. Не знал, что это Json, я не буду заранее знать идентификатор суммы, так что это может не сработать.

2. Я не уверен, но OP может иметь в виду привычку php обрабатывать как number большинство вещей, которые выглядят как number. Например var_dump( '0' == '0x0' ); bool(true) , поля. В данном конкретном случае вы, конечно, можете использовать === , но, как правило, я не знаю лучшего способа справиться с проблемой, чем вообще отказаться от php.

3. Используйте array_pop для получения последнего элемента в массиве вместо array_values

Ответ №2:

 $str = '{"amount_id_341":"200"}';

echo end(json_decode($str, true));
 

Комментарии:

1. Похоже, это простой способ сделать это. К сожалению, только что выяснилось, что это нужно сделать в шаблоне smarty

2. Это возможно, просто вставьте теги smarty php, чтобы включить пользовательский php-код в шаблон. OT: Smarty даже близко не подходит к движку шаблонов, такому как Mustache, что в вашем случае значительно упростило бы задачу (просто мнение о предмете).

Ответ №3:

Решение для регулярных выражений:

 preg_match('/^.*:"(.*)"/', '{"amount_id_341":"200"}', $res);
print $res[1];
 

Ответ №4:

Вы можете решить это с помощью explode :

 $str = '{"amount_id_341":"200"}';
$parts = explode('"', $str);

echo $parts[3];
 

Еще вот регулярное выражение, которое даст вам информацию:

 $str = '{"amount_id_341":"200"}';
$pattern = '/([^"]*)"}$/';
preg_match($pattern, $str, $matches);

echo end($matches);
 

И есть также возможность использовать json_decode :

 $str = '{"amount_id_341":"200"}';
echo end(json_decode($str));
 

Ответ №5:

Разбор подстрок в кавычках

Чтобы получить содержимое последней подстроки, заключенной в двойные кавычки, подразумевает, что вам нужно проанализировать все подстроки, заключенные в двойные кавычки. И если ваш контекст включает строки, заключенные в одинарные кавычки, вам также потребуется проанализировать их все, потому что строка, заключенная в одинарные кавычки, может содержать двойные кавычки (и наоборот). Добавление дополнительного требования о том, что строка, заключенная в кавычки, может содержать экранированные символы (включая экранированные кавычки), приводит к нетривиальному решению регулярных выражений. И чтобы сделать это надежно, мы также должны сначала проверить, что строка состоит только из правильно открытых и закрытых вложенных строк в кавычках, смешанных с материалом, не заключенным в кавычки.

Мы можем достичь всех целей сразу с помощью следующей функции PHP, которая возвращает содержимое последней подстроки, заключенной в двойные кавычки, если таковая имеется:

 // Return contents of last double quoted substring, if any.
function getLastDoubleQuotedSubstring($text) {
    $re_valid_quotes = '/ # Rev:20111031
        # Validate string of quoted and non-quoted substrings.
        ^                 # Anchor to start of string.
        (?:               # Group of 3 global alternatives.
          ([^"'] )       # Either $1: One or more non-quotes.
          (?=['"]|$)     # Anchor end to next alternative.
        | (")             # Or $2: a double quoted string.
          (               # $3: Double-quoted contents.
            [^"\\]*     # {normal*} Zero or more non-", non-.
            (?:           # Begin "Unrolling-the-loop". C-MRE3.
              \\[Ss]  # {special} Escape anything.
              [^"\\]*   # {normal*} Zero or more non-", non-.
            )*            # {(special normal*)*}
          )               # End $3: Double-quoted contents.
          "               # Closing quote.
        | (')            # Or $4: a single quoted string.
          (               # $5: Single-quoted contents.
            [^'\\]*    # {normal*} Zero or more non-', non-.
            (?:           # Begin "Unrolling-the-loop". C-MRE3.
              \\[Ss]  # {special} Escape anything.
              [^'\\]*  # {normal*} Zero or more non-', non-.
            )*            # {(special normal*)*}
          )               # End $5: Single-quoted contents.
          '              # Closing quote.
        )*                # Zero or more global alternatives.
        $                 # Anchor to end of string.
        /x';
    if (preg_match($re_valid_quotes, $text, $matches) amp;amp; isset($matches[3]))
        return $matches[3];
    return  FALSE; // else there was no valid last double quoted substring.
}
 

Пример ввода:

Вот несколько допустимых примеров строк с возрастающей сложностью:

out1 "d1" out2
out1 "d1" out2 "d2" out3
out1 "d1" out2 's1' out3 "d2" out4 's2' out5
out1 "d1'd1" out2 's1"s1' out3 "d2'd2" out4
out1 "d1"d1" out2 's1's1' out3 "d2"d2" out4

Пример вывода:

d1
d2
d2
d2'd2
d2"d2

Неверный ввод:

Вот несколько примеров недопустимых строк (результат должен быть FALSE ):

out1 "d1 out2
out1 "d1 out2 "d2" out3
out1 "d1 's1" ' out2