Как сопоставить блок <li></li> с помощью регулярного выражения - PullRequest
0 голосов
/ 24 июня 2010

как мне сопоставить блок

<li>item 1</li>
<li>item 2</li>

независимо от того, есть ли пустая строка до или после блока, и заключить ее в теги <ul></ul> с помощью PHP * * * * * * * * * * *

Спасибо за ответ

Ответы [ 2 ]

2 голосов
/ 24 июня 2010

Если это безопасный контролируемый ввод, и вы только что получили LI с отсутствующими родительскими UL, вы можете сделать:

preg_replace ( '#\s*(?:<li>.*</li>\s*)+#' , '<ul>$0</ul>', $input )

(вы можете добавить \n к строке замены до илипосле UL.)

ПРИМЕЧАНИЕ. Сбой произойдет, если:

  • Существуют какие-либо существующие списки UL / OL в содержимом.
  • Между последовательными элементами списка есть все, кроме пробелов.
  • Любой из LI охватывает несколько строк (. исключает перевод строки по умолчанию).
  • Есть какие-либо атрибуты в LI.
  • Возможно, некоторые вещи у меня есть

Некоторые из них можно относительно легко удовлетворить, но я не собираюсь - если у вас нет определенного конкретного контента, вам следует использовать realАнализатор HTML вместо.

«Регулярные» в регулярных выражениях имеют определенное значение, и полный HTML-код не a Обычный язык , поэтому пытаетесь обработатьвсе тонкости HTML с простым регулярным выражением могут потерпеть неудачу.
Если вы используете неправильное регулярное выражение в предоставленном пользователем HTML, возможно, вы вводите уязвимости внедрения HTML в свой код.

1 голос
/ 24 июня 2010

Дэвид уже заявил, что php получил xml и html-парсеры.Однако если вы действительно хотите использовать регулярные выражения, это, вероятно, будет что-то вроде:

preg_match('#<li>(.*?)</li>#', $string);
// Same thing
preg_match('#<li>(.*)</li>#U', $string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...