Мне нужно разобрать следующий текст:
First: 1 Second: 2 Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting Fourth: value
Значение представляет собой строку ИЛИ многострочную строку, в то же время значение может содержать подстроку «key: blablabla». Такое subsctring следует игнорировать (не анализироваться как отдельная пара ключ-значение).
Помогите мне с регулярным выражением или другим алгоритмом.
Идеальный результат:
$regex = "/SOME REGEX/"; $matches = []; preg_match_all($regex, $html, $matches); // $mathes has all key and value parsed pairs, including multilines values
Спасибо.
Я пробовал с помощью простых регулярных выражений, но результат неверен, потому что я не знаю, как обращаться с многостроками:
$regex = "/(.+?): (.+?)/"; $regex = "/(.+?):(.+?)\n/"; ...
Вы можете сделать это с помощью этого шаблона:
$pattern = '~(?<key>[^:\s]+): (?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)~'; preg_match_all($pattern, $txt, $matches, PREG_SET_ORDER); print_r($matches);
Вы можете сделать это, если вы считаете одно слово, за которым следует двоеточие в начале строки, чтобы начать новый ключ:
$data = 'First: 1 Second: 2 Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting Fourth: value'; preg_match_all('/^([az]+): (.*?)(?=(^[az]+:|\z))/ims', $data, $matches); var_dump($matches);
Это дает следующий результат:
array(4) { [0]=> array(4) { [0]=> string(10) "First: 1 " [1]=> string(11) "Second: 2 " [2]=> string(86) "Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting " [3]=> string(13) "Fourth: value" } [1]=> array(4) { [0]=> string(5) "First" [1]=> string(6) "Second" [2]=> string(9) "Multiline" [3]=> string(6) "Fourth" } [2]=> array(4) { [0]=> string(3) "1 " [1]=> string(3) "2 " [2]=> string(75) "blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting " [3]=> string(5) "value" } [3]=> array(4) { [0]=> string(7) "Second:" [1]=> string(10) "Multiline:" [2]=> string(7) "Fourth:" [3]=> string(0) "" } }