首页 > 解决方案 > Preg_replace 忽略包含 Wordpress 简码的正则表达式

问题描述

我正在构建一个 PHP 函数,用 preg_replace 替换用户生成的字符串中的“My Term”(对于本例),除非“My Term”位于封闭的短代码标签内,如下所示:

'Replace My Term here [link attr="ignore My Term here"]ignore My Term here[/link]'

所以本质上,正则表达式应该替换字符串中“My Term”的所有实例,除非它们位于“[link”和“[/link]”之间。

我想出了以下正则表达式,当它没有被字母数字字符包围并且不在方括号之间时,它匹配“我的术语”。

preg_replace('~(?<![A-Za-z0-9\]])My Term(?![A-Za-z0-9\[])(?=(?:(?:[^\]]*+\]){2})*+[^\]]*+\z)~', $replacement, $text);

然而!这也忽略了随机短代码之间的所有“我的术语”实例,如下所示:

'[shortcode1] this instance of My Term is ignored when it shouldnt be [shortcode2]'

如何更改此正则表达式以仅在将文本放置在封闭的“[link”和“[/link]”标签之间时忽略文本?

标签: phpregexwordpresspreg-replaceregex-lookarounds

解决方案


好吧,事实证明我使用了一种完全错误的方法,即对单括号字符使用环视。

我目前的正则表达式

'~(?<![A-Za-z0-9\]"])My Term(?![A-Za-z0-9\["])(?!(.(?!\[link))*\[/link\])~'

完全符合我的需要:preg_replace 现在忽略 [link] 标记之间以及引号旁边的“我的术语”,但不在其他随机短代码之间时。


推荐阅读