0

我有使用 preg_match_all 查找电子邮件正文中出现的代码。像这样的东西:

$sHrefPattern = "<(a|area)\s*.*(unsubscribe_url\s*=\s*?)([\"\']??)([^\" >]*?)";
if (preg_match_all("/$sHrefPattern/siU", $sHtmlBody, $aMatches, PREG_SET_ORDER)) {
    // do smth ...
}

和这样的内容(可以包含俄语文本):

... <td align="left" colspan="3" height="22" valign="center">
    <a style="font-size: 8pt; color: #666; padding-left: 13px; font-family: arial;" unsubscribe_url="http://ourcliensite.org/unsubscribe.html">
        Unsubscribe
    </a> |
    <a href="http://ourservice.com/linkswrap?did=819&sid=1&link=http%3A%2F%2Fwww.ourclinetsite.org&dig=7bef6d9ed912392a689bdb9bb6cc581d" style="font-size: 8pt; color: #666; padding-left: 13px; font-family: arial;">
        Advertisement in emails
    </a>
</td> ...

很长一段时间以来,这段代码都运行良好。但是有一天,这段代码停止了正常工作。我认为这与某些软件包安装有关,但我不知道安装了哪个软件包。此代码正在运行的服务器已在我们的团队中共享访问权限。有任何想法吗?

uname -a
Linux ourhost 2.6.32-042stab076.8 #1 SMP Tue May 14 20:38:14 MSK 2013 i686 i686 i386    GNU/Linux
4

2 回答 2

1

检查所涉及的字符集。我对php在这方面的最新变化一无所知,但是您的正则表达式是否也包含俄语?您使用的是 8 位西里尔字符集还是 UTF-8?它是由 PHP 明确设置或检测到的吗?也许您的代码只是忽略了编码问题,并且在某处更改了一些默认值。我建议调试它,就好像它是新代码一样。找到一个失败的正则表达式,找到一个失败的小输入,并尝试确定它的编码。

正则表达式可以使用u修饰符智能地处理 unicode,所以我会先尝试一下,以防它自动修复所有内容。

于 2013-06-12T19:14:36.480 回答
1

我认为邪恶的人在你睡着的时候编辑了你的模式,幸运的是,我建议你测试这个模式来替换旧的:

$sHrefPattern = "<a(?>rea)?\b(?>[^u]++|u++(?!nsubscribe_url\b))+"
               ."unsubscribe_url\s*+=\s*+[\"']?+\K[^\"'\s]++";
preg_match_all("/$sHrefPattern/iu", $sHtmlBody, $aMatches, PREG_SET_ORDER);
print_r($aMatches);

它针对快速失败进行了优化,也请注意新标志,现在结果是整个模式(不需要捕获组),(即组 0)。

于 2013-06-12T19:50:53.253 回答