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

あなたが眠っているときに邪悪な人々があなたのパターンを編集したと思います。幸いなことに、このパターンをテストして古いパターンを置き換えることをお勧めします。

$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 に答える
1

関連する文字セットを確認してください。この点に関して、php に対する最近の変更については何も知りませんが、あなたの正規表現にはロシア語も含まれていますか? 8 ビットのキリル文字セットまたは UTF-8 を使用していますか? PHPによって明示的に設定または検出されていますか? おそらく、あなたのコードはコーディングの問題を無視しているだけで、デフォルトがどこかで変更されています。新しいコードであるかのようにデバッグすることをお勧めします。失敗する正規表現を見つけ、それが失敗する小さな入力を見つけ、そのエンコーディングを決定しようとします。

正規表現は修飾子を使用してユニコードをインテリジェントに処理できるため、uすべてが自動的に修正される場合に備えて、最初にそれを試してみます。

于 2013-06-12T19:14:36.480 に答える