Preg_replace忽略包含Wordpress简码的正则表达式

时间:2019-03-07 14:27:34

标签: php regex wordpress preg-replace regex-lookarounds

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

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

因此,从本质上讲,正则表达式应替换字符串中“我的术语”的所有实例,除非它们位于“ [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]”标记之间时忽略文本?

1 个答案:

答案 0 :(得分:0)

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

我当前的正则表达式

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

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