Сопоставление данных внутри двойной кавычки с использованием 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 ответов
Может быть, это поможет вам (я не уверен, в каком формате вы хотите вывод)
$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":
Чтобы избежать этих результатов, можно запретить "
используя отрицательный символьный класс вместо точки:/"([^"]+)":/
(обратите внимание, что при использовании этого ленивый квантификатор больше не нужен.)