正则表达式,用于删除[...] </p>中包含的元素周围的<p>标记

时间:2010-01-31 00:26:16

标签: regex wordpress

我是一个完全正则表达式的菜鸟。我正在使用wordpress,我正拼命试图处理wordpress的wautop,我讨厌和喜欢(更讨厌!)。无论如何,我正试图删除某些命令周围的<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!

修改: 当我正在进行正则表达式时,它仍然只是一个包含文本的变量..它还没有被解析为html。我知道这是可能的,因为我已经通过摆脱图像标签周围的p标签来做到这一点。所以我只需要一个regexp来处理将来某个时候将被解析为html的文本。 Here's a similar question

谢谢! 马特穆勒

3 个答案:

答案 0 :(得分:5)

您不能使用正则表达式来解析HTML,因为根据定义,HTML是非常规语言。期间,讨论结束。

答案 1 :(得分:4)

匹配HTML标记的语言是context-free,而不是regular。这意味着正则表达式可能不是在这里使用的正确工具。无上下文语言需要解析器而不是正则表达式。因此,您可以使用正则表达式删除所有<p></p>标记,也可以使用HTML解析器从文档的某些部分删除匹配的标记。

答案 2 :(得分:2)

试试这个正则表达式:

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

说明:

\[([^\[\]]+)\]与开头的bbcode代码匹配,并捕获#2组中的代码名称。

\[/\2\]匹配相应的丢失标记。

.*?不情愿地匹配任何东西。感谢最后的s标志,它也匹配换行符。不情愿.*?的效果是它在第一次找到具有正确名称的结束bbcode标记时停止匹配。如果标签嵌套(在具有相同名称的标签内)或不正确地平衡,则它将无法正常工作。我不希望这是一个问题,但我没有使用WordPress的经验,所以YMMV。