6

私は正規表現が苦手なので、これが何をするのかさえわかりません。

echo preg_match('/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/', 'example12345678.com>');

古いバージョンのZendFramework-1.5から取得しました。これは古く、フレームワークの最後の安定バージョンでは、この正規表現は表示されなくなりました。ただし、公式のphpリソースに文書化された説明や後方互換性のないメモが見つからなかったため、その動作は不思議です。

問題は、php 5.2。*では正常に動作することです。0を返します。php5.3.10、5.4.0(おそらく5.3。、5.4。私は推測します)では、FALSEを返します。これは「エラー」を意味します。

私の質問は:なぜですか?そして、エラーは何ですか?それは正規表現、ある種の再帰、またはルールのあいまいさですか?もしそうなら、なぜそれがphp 5.2で動作するのですか?


興味深いことに、「example12345678.com>」を「example1234567.com>」に変更すると(1文字以上短くなります)、動作を開始して0を返します。「123123123123123123123123123」に変更すると、1を返します。 。

UPD:これが重要かどうかはまだわかりませんが、ここでのPCREバージョンは8.02(php 5.2)と8.12(php 5.3)です。


UPD2:私はそれが何のためにあるのか理解しています...多かれ少なかれ...そして今何かが機能することに問題はありません。私が言ったように-Zend_Validate_*アップデートはそれを解決します。私の懸念を別の言葉で説明しようと思います。

たとえば、重要なソフトウェアをアップグレードして、php5.2>php5.3スイッチにします。私は直面する可能性のあるすべての問題に関する情報を見つけようとします(主にこれを読むことによって:http://php.net/manual/en/migration53.php)。ソフトウェアは少し古いですが、古くはありません。たとえば、ZendFrameworkはバージョン1.5である可能性があります。私はすべてのBCブレークと非推奨の機能をチェック/パッチ/分析して修正します。私の単体テストでも問題なく実行されます。

驚いたことに、質問で説明されていることが起こります。(正確には、Zend_Validate_Hostnameは例外をスローします)。だから今、アップグレード時にこれを見逃した理由と、さらに重要なのは、アプリ内のすべての「preg_match」(および他のPCRE利用関数)を再チェックして、同様の「バグ修正」を見つけるために考えられるさまざまな入力データを試す必要があるかどうかを知りたいです"。

「バグ修正」の場合。これは新しいバグのように見えるため、以前はphp5.2で期待どおりに機能していましたが、現在は機能していません。

検索を絞り込むための手がかりを得ることを望んでいました。

4

1 に答える 1

3

それは醜い正規表現です。問題は、文字列が一致する可能性のある方法が多すぎるため、実際には一致しないと判断する前に、エンジンがすべての方法を試してメモリ不足になることです。

また、有効なドメイン名を照合しようとしているようですが、一致していません。preg_match代わりに、この関数への呼び出しにその呼び出しを置き換えます。

function is_valid_domain_name($string) {
    if (strlen($string) > 253) {
        return false;
    }
    $label = '(?!-)[a-zA-Z0-9-]{0,63}(?<!-)';
    return preg_match("/^(?:$label\.){0,126}$label$/", $string);
}

問題の文字列ですぐに失敗します:

echo is_valid_domain_name('example12345678.com>'),"\n";
于 2012-05-17T23:52:50.593 に答える