2009-06-17 2 views
0

У меня есть это регулярное выражение в PHP:Regex, матч между тегами перевода строки

preg_match('/\[summary\](.+)\[\/summary\]/i', $data['text'], $match); 

Он отлично работает, когда текст между сводным тегами на одной строке. Однако, когда он содержит символы новой строки, он не совпадает.

Я попытался найти правильный модификатор здесь: http://nl2.php.net/manual/en/reference.pcre.pattern.modifiers.php Но единственное, что связано с новостями, это «m», и это не делает то, что я хочу.

Как это сделать?

+2

Обратите внимание, что ваше регулярное выражение будет соответствовать [summary], а затем соответствует концу строки, а затем возвращается назад, пока не найдет [/ summary]. То, что вы, вероятно, хотите, это остановить его после первого [/ summary] после [summary]. Самый простой способ сделать это - использовать не-жадный квантификатор: (. +?) – Blixt

+0

Будет только один набор тегов суммирования, и он будет написан только администраторами, поэтому здесь это не имеет никакого значения. Спасибо за подсказку. –

ответ

2

Связанная страница человека описывает другие параметры, которые влияют на то, как обрабатываются разрывы строк.

s (PCRE_DOTALL) Если этот модификатор установлен, точечный метасимвол в шаблоне соответствует всем символам, включая строки новой строки. Без него новые строки исключаются. Этот модификатор эквивалентен модификатору Perl/s. Отрицательный класс, такой как [^ a], всегда соответствует символу новой строки, независимо от настройки этого модификатора.

+0

woops, по-видимому, недостаточно хорошо читал –

0

Regexes в корне плохо при разборе HTML (см. Can you provide some examples of why it is hard to parse XML and HTML with a regex? для чего). Вам нужен парсер HTML. См. Can you provide an example of parsing HTML with your favorite parser? для примеров с использованием различных парсеров.

Вы можете найти это answer, которое использует SimpleXML полезно.

Смежные вопросы