我正在构建一个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]”标记之间时忽略文本?
答案 0 :(得分:0)
好吧,事实证明我是在使用完全错误的方法,即对单个方括号字符使用环视。
我当前的正则表达式
'~(?<![A-Za-z0-9\]"])My Term(?![A-Za-z0-9\["])(?!(.(?!\[link))*\[/link\])~'
完全满足我的需要:preg_replace现在忽略[link]标记之间以及引号旁边时的“我的术语”,但是忽略其他随机短代码之间的“我的术语”。