首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Regex -在特定模式之后删除特定的字符串

PHP Regex -在特定模式之后删除特定的字符串
EN

Stack Overflow用户
提问于 2016-10-31 08:59:54
回答 1查看 96关注 0票数 2

我正在用WordPress编写列短代码,它总是在标记后面添加</p>

因此,转储变量的原始HTML结果如下所示:

代码语言:javascript
复制
<column class="size-5"></p>
....
</column>

我想用regex删除唯一的</p>,所以我做了以下操作:

代码语言:javascript
复制
$content = preg_replace("/(?!<column[^<]+)<\/p>/", '', $content);

我匹配了</p>,同时排除了列标记。这是Regexr链接

在regexr (我假设使用JS语法)中,它工作得很好。但是在PHP中,它匹配每个</p>并删除它。

我已经尝试过许多?<!?>!后面的变体,但是不起作用。

以前有没有人经历过同样的问题?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-31 09:30:01

首先,您应该知道使用regex操作HTML是容易受到攻击的,在任意HTML代码的情况下不可能100%工作。您应该只在知道自己正在做什么时才使用它(您自己以独特的方式生成HTML,或者HTML提供程序是已知的,并且使用unqiue方法进行HTML转义,等等)。

接下来,您不需要使用任何负面的外观。您所使用的模式匹配任何不是</p>子模式的起始子序列的<column[^<]+子模式,该子模式总是正确的,并且有效地匹配了任何</p>

如果要删除某些特定已知上下文中出现的文本,则可能依赖于捕获所需内容并匹配要替换的内容。唯一要做的就是将您需要保留的模式的一部分与(...)放在一起,并在替换模式中使用对该组的反向引用。

使用

代码语言:javascript
复制
$content = preg_replace('/(<column\b[^<]*>)<\/p>/', '$1', $content);

或者,在PCRE中,您可以使用\K运算符,该运算符省略了与之匹配的整个文本,如

代码语言:javascript
复制
$content = preg_replace('/<column\b[^<]*>\s*\K<\/p>/', '', $content);

而且您不必在替换模式中使用任何反向引用。

我添加了\b (word边界),以确保column匹配为一个完整的单词。因为它仍然可以在column中与column-editor相匹配,所以您可能需要用<column(?:\s[^<]*)?>来修复<column\b[^<]*>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40339085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档