предварительный матч ведет себя очень странно


Я использую preg_match() для извлечения фрагментов текста из переменной, и, скажем, переменная выглядит так:

[htmlcode]This is supposed to be displayed[/htmlcode]

middle text

[htmlcode]This is also supposed to be displayed[/htmlcode]

Я хочу извлечь содержимое [htmlcode] и ввести их в массив. я делаю это с помощью preg_match().

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}

Приведенный выше код выводит

[htmlcode]This is supposed to be displayed[/htmlcode]middle text[htmlcode]This is also supposed to be displayed[/htmlcode]

Вместо

  1. [htmlcode] Это должно отображаться [/htmlcode]
  2. [htmlcode] Это также должно отображаться[/htmlcode]

И если официально закончились идеи

Author: kapa, 2013-05-10

4 answers

Как уже объяснялось; шаблон * является жадным. Другое дело - использовать функцию preg_match_all(). Он вернет вам многомерный массив сопоставленного контента.

preg_match_all('#\[htmlcode\]([^\"]*?)\[/htmlcode\]#ms', $text, $matches);
foreach( $matches[1] as $value ) {

И вы получите это: http://codepad.viper-7.com/z2GuSd

 4
Author: hjpotter92, 2013-05-09 23:27:40

Групер * жадный, т.е. он будет есть все, пока не закончится [/htmlcode]. Попробуйте заменить * на нежадный *?.

 3
Author: Stefano Sanfilippo, 2013-05-09 23:22:03

* по умолчанию жадный, ([^\"]*?) (обратите внимание на добавленный ?) должен сделать его ленивым.

 2
Author: kapa, 2017-05-23 12:29:22

Посмотрите на этот фрагмент кода:

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}

Теперь, если ваш шаблон работает нормально и все в порядке, вы должны знать:

  • return оператор разорвет все циклы и завершит работу функции.
  • Первый элемент в совпадениях - это все совпадение, вся строка. В вашем случае $text

Итак, то, что вы сделали, вернуло первую большую строку и вышло из функции.

Я предлагаю вам проверить желаемые результаты:

$matches[1] и $matches[2]

 2
Author: vikingmaster, 2013-05-09 23:22:23