2

HTML コメントに基づく構文を使用して、ユーザーが簡単に記述できないフラッシュ ビデオ プレーヤー、スライドショー、およびその他の「ハード」コードをユーザーが挿入できるようにする CMS があります。

1 つの FLV ムービーの構文は次のようになります。 <!--PLAYER=filename.flv-->

私はこのコードを使用します:

$find_players = preg_match("/<!--PLAYER\=(.*)-->/si", $html_content, $match);

$match[1] にはファイル名が含まれています (これだけで十分です)。

正規表現に関する私の知識は失われつつあるため、これを調整して複数の一致を取得することはできません。

ページにもっとある場合は、あまりにも貪欲に (最初<!--PLAYERから最後まで) 一致するため、完全に壊れます。-->

4

3 に答える 3

2

正規表現を使用する場合、通常、過剰なバックトラッキングの原因となる「レイジー ドット」よりも、より具体的な表現を使用する方がパフォーマンスが高くなります。否定先読みを使用して、正規表現エンジンに負担をかけずに同じ結果を得ることができます。

$find_players = preg_match("/<!--PLAYER=((?:[^-]+|-(?!->))*)-->/ig", $html_content, $match);

このような単純なケースでは、遅延ドットを使用しても目立った問題が発生する可能性は低いですが、正規表現エンジンに常に正確に意味を伝えることは良い習慣です。この場合、コメント ターミネータを渡さずに、できるだけ多くの文字を収集する必要があります (「貪欲」)。ターミネータは、ダッシュの後に別のダッシュと大なり記号が続くものです。したがって、ダッシュまたはコメント終了文字を開始しないダッシュを除く任意の文字を任意の数だけ使用できます。

于 2009-01-14T00:33:11.423 に答える
2

おそらく、正規表現修飾子 U (PCRE_UNGREEDY、貪欲に一致させる) が必要です。つまり、最初の <!--PLAYER= の最初から最後の --> の終わりまでは一致しません。

簡略化された例:

<?php
$text = "blah\n<!-x=abc->blah<!-x=def->blah\n\nblah<!-x=ghi->\nblahblah" ;
$reg  = "/<!-x=(.*)->/U" ;
preg_match_all( $reg, $text, $matches ) ;
print_r( $matches ) ;

コードは次のようになります。

$find_players = preg_match_all("/<!--PLAYER=(.*)-->/Ui", $html_content, $matches);
// print $matches[1] ;

使用している「s」修飾子 (PCRE_DOTALL) もおそらく役に立ちません。ファイル名に改行が含まれている可能性は低いです。

編集:@Stevensはこの構文を提案していますが、これは少し明確であることに同意します-U修飾子をキャプチャ括弧に移動します。

$find_players = preg_match_all("/<!--PLAYER=(?U)(.*)-->/i", $html_content, $matches);
于 2009-01-14T00:16:01.737 に答える
1
$find_players = preg_match("/<!--PLAYER\=(.*?)-->/i", $html_content, $match);

(. *? )

うまくいくはずです。

于 2009-01-14T00:11:26.507 に答える