我有一个脚本,可以在我们办公室的备用触摸屏上从群组收件箱下载最新的新闻稿。它工作正常,但人们不小心取消订阅我们,所以我想隐藏电子邮件中的取消订阅链接。
$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脚本运行?
由于
答案 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*>/';