我是一个完全正则表达式的菜鸟。我正在使用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
谢谢! 马特穆勒
答案 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。