предварительный матч ведет себя очень странно
Я использую 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]
Вместо
- [htmlcode] Это должно отображаться [/htmlcode]
- [htmlcode] Это также должно отображаться[/htmlcode]
И если официально закончились идеи
4 answers
Как уже объяснялось; шаблон *
является жадным. Другое дело - использовать функцию preg_match_all()
. Он вернет вам многомерный массив сопоставленного контента.
preg_match_all('#\[htmlcode\]([^\"]*?)\[/htmlcode\]#ms', $text, $matches);
foreach( $matches[1] as $value ) {
И вы получите это: http://codepad.viper-7.com/z2GuSd
Групер *
жадный, т.е. он будет есть все, пока не закончится [/htmlcode]
. Попробуйте заменить *
на нежадный *?
.
*
по умолчанию жадный, ([^\"]*?)
(обратите внимание на добавленный ?
) должен сделать его ленивым.
Посмотрите на этот фрагмент кода:
preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches);
foreach($matches as $value){
return $value . "<br />";
}
Теперь, если ваш шаблон работает нормально и все в порядке, вы должны знать:
-
return
оператор разорвет все циклы и завершит работу функции. - Первый элемент в совпадениях - это все совпадение, вся строка. В вашем случае
$text
Итак, то, что вы сделали, вернуло первую большую строку и вышло из функции.
Я предлагаю вам проверить желаемые результаты:
$matches[1]
и $matches[2]