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

时间:2013-08-15 11:09:35

标签: php preg-replace

我有一个脚本,可以在我们办公室的备用触摸屏上从群组收件箱下载最新的新闻稿。它工作正常,但人们不小心取消订阅我们,所以我想隐藏电子邮件中的取消订阅链接。

$preg_replace似乎会起作用,因为我可以设置一个模式,只需删除任何带有“取消订阅”字样的链接。我使用http://regex101.com/处的工具验证了下面的模式,它甚至选择“管理订阅”等变体。如果与subscribe这个单词的奇怪合法链接也被删除也没关系 - 没有很多,它只供内部使用。

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

这是我的代码:

第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脚本运行?

由于

5 个答案:

答案 0 :(得分:0)

你没有分隔符。或者说你做了,但它不是你的意思。 PCRE将您的第一个<解释为开头分隔符(您可以使用匹配括号作为分隔符 - 实际上,我使用括号来帮助提醒自己整个匹配是索引0)。然后它将第一个>视为结束分隔符。之后的任何东西都应该是修饰语,但当然]不是修饰语。

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

答案 1 :(得分:0)

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

尝试这样的事情

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

答案 2 :(得分:0)

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

它试图解析bodycontent] ...作为数组索引。

答案 3 :(得分:0)

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

例如,字符串开头和结尾有/~

字符串末尾的这些分隔符之外的任何内容都被视为正则表达式“修饰符”。

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

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

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

(它不一定是~,你可以选择你自己的修饰符来满足你的需要。最好使用的是你的字符串中没有的一个(尽管你可以逃脱它它确实)

答案 4 :(得分:0)

使用斜杠/

开始和结束模式
$pat='/<\s*(a|A)\s+[^>]*>[^<>]*ubscri[^<>]*<\s*\/(a|A)\s*>/';