Сопоставление данных внутри двойной кавычки с использованием preg_match_all

Данные, приведенные ниже, представлены в формате, подобном "name":"Value", "name2":"Value 2", "name3":"Value 3"

$datadump = '"Waived":"Waived", "Until":" until", "HeaderBanInfo":"Ban Info", "StatusLabel":"Current Status:", "StatusBanned":"BANNED", "StatusWarned":"WARNED", "StatusSuspended":"SUSPENDED", "StatusActive":"ACTIVE"';

Я пытался извлечь имена с помощью php

    $pattern = '/"(.*?)":/si';
preg_match_all($pattern, $datadump, $output);

Но это не работает. Надеюсь, кто-нибудь, кто знает, как это исправить, поможет мне. Благодарю вас.

6 ответов

Попробуйте это $pattern = '/\"([a-zA-Z0-9]*?)\":/si';

Проверьте мое решение:

json_decode('{'.$datadump.'}');

лол

Может быть, это поможет вам (я не уверен, в каком формате вы хотите вывод)

$datadump = '"Waived":"Waived", "Until":" until", "HeaderBanInfo":"Ban Info",      "StatusLabel":"Current Status:", "StatusBanned":"BANNED", "StatusWarned":"WARNED", "StatusSuspended":"SUSPENDED", "StatusActive":"ACTIVE"';

print_r(explode(':',str_replace(',',':',$datadump)))

выход:

[0] => "Waived"
[1] => "Waived"
[2] =>  "Until"
[3] => " until"
[4] =>  "HeaderBanInfo"
[5] => "Ban Info"
[6] =>       "StatusLabel"
[7] => "Current Status
[8] => "
[9] =>  "StatusBanned"
[10] => "BANNED"
[11] =>  "StatusWarned"
[12] => "WARNED"
[13] =>  "StatusSuspended"
[14] => "SUSPENDED"
[15] =>  "StatusActive"
[16] => "ACTIVE"

Хорошо, поскольку из вашего вопроса не ясно, какое имя вы хотите. Ниже код показывает, как получить любое из имен:

Для получения имен:

$datadump = '"Waived":"Waived", "Until":" until", "HeaderBanInfo":"Ban Info", "StatusLabel":"Current Status:", "StatusBanned":"BANNED", "StatusWarned":"WARNED", "StatusSuspended":"SUSPENDED", "StatusActive":"ACTIVE"';

$pattern_for_1st_name = '/"([a-zA-Z:\s]*?)":/';

preg_match_all($pattern_for_1st_name, $datadump, $output);

var_dump($output[1]);

Это выведет первые имена в паре:

array(8) { [0]=> string(6) "Waived" [1]=> string(5) "Until" [2]=> string(13) "HeaderBanInfo" [3]=> string(11) "StatusLabel" [4]=> string(12) "StatusBanned" [5]=> string(12) "StatusWarned" [6]=> string(15) "StatusSuspended" [7]=> string(12) "StatusActive" } 

Для получения вторых имен:

Теперь, если вам нужны вторые имена в паре, ниже приведен образец для этого:

 $pattern_for_2nd_name = '/:"([a-zA-Z:\s]*?)"/';

 preg_match_all($pattern_for_2nd_name, $datadump, $output);

 var_dump($output[1]);

Это выведет вторые имена:

array(8) { [0]=> string(6) "Waived" [1]=> string(6) " until" [2]=> string(8) "Ban Info" [3]=> string(15) "Current Status:" [4]=> string(6) "BANNED" [5]=> string(6) "WARNED" [6]=> string(9) "SUSPENDED" [7]=> string(6) "ACTIVE" }

Я не знаю, действительно ли ваши данные Current Status: слово или двоеточие было опечаткой, поэтому также включало двоеточие для совпадения.

Это будет работать нормально:

$datadump = '"Waived":"Waived", "Until":" until", "HeaderBanInfo":"Ban Info",      "StatusLabel":"Current Status:", "StatusBanned":"BANNED", "StatusWarned":"WARNED", "StatusSuspended":"SUSPENDED", "StatusActive":"ACTIVE"';
$pattern = '/\"([a-zA-Z\s]*?)\":/si';
preg_match_all($pattern, $datadump, $output);
$names = $output[1];
echo $names[2]; /* this is a simple test */

РЕДАКТИРОВАТЬ (только для буквенно-цифровых имен)

$datadump = '"a0":"Waived", "Until":" until", "HeaderBanInfo":"Ban Info",      "StatusLabel":"Current Status:", "StatusBanned":"BANNED", "StatusWarned":"WARNED", "StatusSuspended":"SUSPENDED", "StatusActive":"ACTIVE"';
$pattern = '/\"([a-zA-Z0-9]*?)\":/si';
preg_match_all($pattern, $datadump, $output);
$names = $output[1];
for($i=0; $i<sizeof($names); $i++)
   echo $names[$i] . "\n";

РЕДАКТИРОВАТЬ 2 (это позволяет пробелы между именем и двоеточием)

$datadump = '"a0" : "Waived", "Until":" until", "HeaderBanInfo":"Ban Info",      "StatusLabel":"Current Status:", "StatusBanned":"BANNED", "StatusWarned":"WARNED", "StatusSuspended":"SUSPENDED", "StatusActive":"ACTIVE"';
$pattern = '/\"([a-zA-Z0-9]*?)\"[\s]*:/';
preg_match_all($pattern, $datadump, $output);
$names = $output[1];
for($i=0; $i<sizeof($names); $i++)
   echo $names[$i] . "\n";

Поскольку ваша входная строка JSON, вам не нужно использовать preg_match_all, лучше использовать формат данных:

print_r(array_keys(json_decode('{' . $datadump . '}', true)));

Руководство по PHP:
json_decode
array_keys

О вашей модели:
Это не работает, потому что .*? позволяет любые символы, включая ", Движок регулярных выражений будет проходить строку слева направо, символ за символом, и даст совпадение как можно скорее. Вот почему ваш второй результат: "Waived", "Until":

Чтобы избежать этих результатов, можно запретить " используя отрицательный символьный класс вместо точки:
/"([^"]+)":/ (обратите внимание, что при использовании этого ленивый квантификатор больше не нужен.)

Другие вопросы по тегам