Регулярное выражение для удаления тегов <p>вокруг элементов, завернутых в [...] - PullRequest
1 голос
/ 31 января 2010

Я полный регулярный пользователь noob. Я работаю с WordPress и отчаянно пытаюсь разобраться с wautop WordPress, который я ненавижу и люблю (больше ненавижу!). В любом случае я пытаюсь удалить теги <p> вокруг определенных команд.

Вот что я получаю:

<p>
[hide]
<img.../>
[/hide]
</p>

или

<p>
[imagelist]
<img .../>
<img .../>
[/imagelist]
</p>

Вот что я хотел бы:

[hide]
<img.../>
[/hide]

или

[imagelist]
<img .../>
<img .../>
[/imagelist]

Я пробовал:

preg_replace('/<p[^>]*>(\[[^>]*\])<\/p[^>]*>/', '$1', $content); // No luck!

EDIT: Когда я делаю регулярное выражение, это все еще просто переменная, содержащая текст .. Он еще не проанализирован как HTML. Я знаю, что это возможно, потому что я уже сделал это, избавившись от p-тегов вокруг тега изображения. Поэтому мне просто нужно регулярное выражение для обработки текста, который будет проанализирован как html в будущем. Вот похожий вопрос

Спасибо! Мэтт Мюллер

Ответы [ 3 ]

5 голосов
/ 31 января 2010

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

4 голосов
/ 31 января 2010

Язык соответствующих тегов HTML: не зависит от контекста , а не обычный . Это означает, что регулярные выражения, вероятно, не подходят для использования здесь. Для контекстно-свободных языков требуются парсеры, а не регулярные выражения. Таким образом, вы можете либо удалить ВСЕ теги <p> и </p> с регулярным выражением, либо использовать анализатор HTML для удаления соответствующих тегов из определенных частей документа.

2 голосов
/ 02 февраля 2010

Попробуйте это регулярное выражение:

'%<p[^>]*>\s*(\[([^\[\]]+)\].*?\[/\2\])\s*</p>%s'

Пояснение:

\[([^\[\]]+)\] соответствует открывающему тегу bbcode и фиксирует имя тега в группе №2.

\[/\2\] соответствует соответствующему проигрышному тегу.

.*? совпадает с чем угодно, неохотно. Благодаря знаку s в конце он также соответствует символу новой строки. Эффект нежелательного .*? состоит в том, что он прекращает сопоставление в первый раз, когда находит закрывающий тег bbcode с правильным именем. Если теги вложены (в теги с одинаковыми именами) или неправильно сбалансированы, они не будут работать правильно. Я не ожидал бы, что это будет проблемой, но у меня нет опыта работы с WordPress, так что YMMV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...