2

PHP には 2 つの文字列があります。

$string  = '<a href="http://localhost/image1.jpeg" /></a>';

$string2 = '[caption id="attachment_5" align="alignnone" width="483"]<a href="http://localhost/image1.jpeg" /></a>[/caption]';

最初のタイプの文字列を一致させようとしています。それは、'[caption ... ]' と '[/caption]' で囲まれていない文字列です。これまでのところ、次のようなものを使用したいと思います。

$pattern = '/(?<!\[caption.*\])(?!\[\/caption\])(<a.*><img.*><\/a>)/';

しかし、PHP は最初の文字列もこのパターンに一致させますが、先頭に「[caption」がなく、その後に「]」が続く 0 個以上の文字はありません。何を与える?これはなぜですか、正しいパターンは何ですか?

ありがとう。

4

3 に答える 3

0

可変長後読みはPHPでサポートされていないため、パターンのこの部分は無効です。

(?<!\[caption.*\])

これについて警告する必要があります。

さらに、.*常に可能な限り大きな量に一致します。したがって、パターンによって、複数のタグと重複する一致が生じる可能性があります。代わりに、[^>](閉じ括弧以外のものと一致する)を使用します。これは、閉じ括弧がimgタグ内で発生してはならないためです。

後読みの問題を解決するために、終了タグのみをチェックしてみませんか?これで十分です(キャプションタグが表示した方法と同様の方法でのみ使用されると仮定します)。

$pattern = '|(<a[^>]*><img[^>]*></a>)(?!\[/caption\])|';

を含むパターンを照合する場合は/、傾いた楊症候群を避けるために、パターン区切り文字として別​​の文字を使用してください。パターンの周囲には、ほぼすべての英数字以外の文字を使用できます。

更新:以前の正規表現は、サンプルデータではなく、指定したサンプル正規表現に基づいています。画像を含まないリンクを照合する場合は、次のようにします。

$pattern = '|(<a[^>]*>[^<]*</a>)(?!\[/caption\])|';

これにより、リンクの途中にタグを含めることができないことに注意してください。タグを許可する場合(を使用するなど.*?)、正規表現は、内で始まり、[caption]他の場所で終わるものと一致する可能性があります。

于 2013-03-06T14:16:26.060 に答える
0

を探して<a.*><img.*><\/a>おり、両方のアンカーに<img...タグが含まれていないため、正規表現がどちらの文字列にも一致するかわかりません。また、-ビットを探して禁止する 2 つの部分式は、caption奇妙に配置されているように見えます。最後に、タグ マッチング ビットが貪欲に動作しないようにする必要があります。つまり、.*butを使用しないでください[^>]*

このようなことを意味しますか?

$pattern = '/(<a[^>]*>(<img[^>]*>)?<\/a>)(?!\[\/caption\])/'

regex101でテストします。

編集: dan1111 の提案に従って役に立たない先読みを削除し、regex101 リンクを更新しました。

于 2013-03-06T14:23:18.780 に答える
-1

後読みは非固定長パターン、つまり (*,+,?) を許可しません。これ/<a.*><\/a>(?!\[\/caption\])/で十分だと思います。

于 2013-03-06T14:21:57.763 に答える