私はルックアラウンド アサートについてもっと理解しようとしていますが、このスレッドを見つけました。PHP ではルック ビハインド アサートを固定長にする必要があるため、解決策は一部のエンジンでは機能するはずですが、PHP では機能しないはずです。
私が望むのは、同じシナリオを PHP で機能させるか、少なくともそれが可能かどうかを知ることです。
正規表現ルールの説明を減らしてみたので、上記のスレッドと同じではありませんが、同じ原則に従います。
3 つの部分で構成される文字列に一致する必要があります。
- 任意の数の英数字で始まる
- 「abc-」の後に 3 ~ 5 個の数字やハイフンが続くものを含まない
- 「.htm」または「.html」で終わる
したがって、これらは次のように一致します。
- xxxyz-123.html
- xx123-abc.htm
- xxabc123.html
- xxabc-123-45.htm
しかし、これらは一致しません:
- xxabc-4324.htm
- xxabc-1-2.html
- xxac-12-34.txt
- xxabc-12345.htm
以下の正規表現パターンのいくつかのバリエーションを試してみましたが、うまくいきません - この特定のケースは固定長の制限のためです:
.*(?<!abc-[\d-]{3,5})\.htm[^l]?$
また、さまざまなテスト文字列を使用し、正確に、たとえば 3 つの数字および/またはハイフンのみに焦点を当てて、3 ~ 5 の範囲部分を忘れて、以下の正規表現を使用しましたが、それでも機能しません。これについて助けを求める:
.*(?<!abc-[\d-]{3})\.htm[^l]?$
正規表現の専門家の誰かがここで私を助けてくれませんか?
編集
これは私のテスト用 PHP コードです。
$regex = "/^(?!.*abc-[\d-]{3,5})[a-zA-Z0-9-]+\.html?$/";
foreach ( $matching2 as $k => $v ) {
$matches = preg_match( $regex, $v );
echo '"', $v, '"', ( $matches != 0 ) ? ' matches' : ' doesn\'t match', '<br />';
}