我正在用WordPress编写列短代码,它总是在标记后面添加</p>。
因此,转储变量的原始HTML结果如下所示:
<column class="size-5"></p>
....
</column>我想用regex删除唯一的</p>,所以我做了以下操作:
$content = preg_replace("/(?!<column[^<]+)<\/p>/", '', $content);我匹配了</p>,同时排除了列标记。这是Regexr链接。
在regexr (我假设使用JS语法)中,它工作得很好。但是在PHP中,它匹配每个</p>并删除它。
我已经尝试过许多?<!和?>!后面的变体,但是不起作用。
以前有没有人经历过同样的问题?
谢谢
发布于 2016-10-31 09:30:01
首先,您应该知道使用regex操作HTML是容易受到攻击的,在任意HTML代码的情况下不可能100%工作。您应该只在知道自己正在做什么时才使用它(您自己以独特的方式生成HTML,或者HTML提供程序是已知的,并且使用unqiue方法进行HTML转义,等等)。
接下来,您不需要使用任何负面的外观。您所使用的模式匹配任何不是</p>子模式的起始子序列的<column[^<]+子模式,该子模式总是正确的,并且有效地匹配了任何</p>。
如果要删除某些特定已知上下文中出现的文本,则可能依赖于捕获所需内容并匹配要替换的内容。唯一要做的就是将您需要保留的模式的一部分与(...)放在一起,并在替换模式中使用对该组的反向引用。
使用
$content = preg_replace('/(<column\b[^<]*>)<\/p>/', '$1', $content);或者,在PCRE中,您可以使用\K运算符,该运算符省略了与之匹配的整个文本,如
$content = preg_replace('/<column\b[^<]*>\s*\K<\/p>/', '', $content);而且您不必在替换模式中使用任何反向引用。
我添加了\b (word边界),以确保column匹配为一个完整的单词。因为它仍然可以在column中与column-editor相匹配,所以您可能需要用<column(?:\s[^<]*)?>来修复<column\b[^<]*>。
https://stackoverflow.com/questions/40339085
复制相似问题