0

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

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

谢谢

4

5 回答 5

0

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

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

于 2013-08-15T11:12:42.217 回答
0

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

尝试这样的事情

$pat='#<\s*(a|A)\s+[^>]*>[^<>]*ubscri[^<>]*<\s*\/(a|A)\s*>#';
于 2013-08-15T11:12:56.627 回答
0

$themail[bodycontent]应该是$themail['bodycontent']$themail[$bodycontent]

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

于 2013-08-15T11:13:54.413 回答
0

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

例如,a/或 a~在字符串的开头和结尾。

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

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

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

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

(不一定是~,您可以选择自己的修饰符来满足您的需要。最好使用的修饰符是字符串中没有出现的修饰符(尽管如果出现,您可以将其转义)

于 2013-08-15T11:15:54.583 回答
0

斜线图案的开始和结束/

$pat='/<\s*(a|A)\s+[^>]*>[^<>]*ubscri[^<>]*<\s*\/(a|A)\s*>/';
于 2013-08-15T11:16:06.597 回答