简单preg替换脚本中出现意外]错误


Unexpected ] error in simple preg replace script

我有一个脚本,可以在我们办公室的备用触摸屏上从小组收件箱下载最新的时事通讯。它很好用,但人们总是不小心取消订阅我们,所以我想从电子邮件中隐藏取消订阅链接。

$preg_replace似乎可以工作,因为我可以设置一个模式,只需删除中带有"取消订阅"一词的任何链接http://regex101.com/,甚至还采用了"管理订阅"之类的变体。如果带有"订阅"一词的奇怪合法链接也被删除,那也没关系——不会有太多,而且只供内部使用。

然而,当我执行时,我会得到一个错误。

这是我的代码:

第53行:$pat='<'s*(a|A)'s+[^>]*>[^<>]*ubscri[^<>]*<'s*'/(a|A)'s*>';

第54行:$themail[bodycontent]= preg_replace($pat, ' ',$themail[bodycontent]);

我得到这个错误:

preg_replace()[function.preg replace]:第54行上/home/trev/public_html/bigscreen/screen-functions.php中的未知修饰符"]"

它一定是一个非常简单的东西,比如一个无标题的字符,但我已经对代码视而不见,一辈子都看不到它

如何获得此模式:

<'s*(a|A)'s+[^>]*>[^<>]*ubscri[^<>]*<'s*'/(a|A)'s*>

在一个简单的php脚本中运行?

感谢

您没有使用任何分隔符,因此它将<字符视为分隔符

试试这样的东西,而不是

$pat='#<'s*(a|A)'s+[^>]*>[^<>]*ubscri[^<>]*<'s*'/(a|A)'s*>#';

您没有分隔符。或者更确切地说,你是这样做的,但这不是你想要的。PCRE将您的第一个<解释为起始分隔符(您可以使用匹配的括号作为分隔符——事实上,我使用括号来提醒自己,整个匹配是索引0)。然后,它将第一个>视为结束分隔符。之后的任何内容都应该是修饰符,但]当然不是修饰符。

(...)包装正则表达式,为其提供一组合适的分隔符。

$themail[bodycontent]应为$themail['bodycontent']$themail[$bodycontent]

它正在尝试解析正文内容]。。。作为数组索引。

preg_match中使用的模式需要用一对分隔符括起来。

例如,在字符串的开始和结束处的/~

字符串末尾这些分隔符之外的任何内容都被认为是regex"修饰符"。

您的示例没有分隔符,因此PHP错误地假设<字符是分隔符。因此,它将下一个<字符视为结束分隔符,并因此将其后的任何字符视为修饰符。显然,所有这些东西都应该在模式中,而作为修饰符是无效的,这就是PHP抱怨的原因。

解决方案:添加一对修饰符字符:

$pat='~<'s*(a|A)'s+[^>]*>[^<>]*ubscri[^<>]*<'s*'/(a|A)'s*>~';
      ^                                                   ^
    add this                                         ...and this

(它不一定是~,您可以根据自己的需要选择自己的修饰符字符。最好使用的是不出现在字符串中的字符(尽管如果出现,您可以转义它)

斜线/ 模式的开始和结束

$pat='/<'s*(a|A)'s+[^>]*>[^<>]*ubscri[^<>]*<'s*'/(a|A)'s*>/';