4

preg_replace次の正規表現でPHPを使用しています。

/(?<=#EXTINF:([0-9])+,).+?(?=#EXT)/gsm

次の文字列を操作します。

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10,
Grab_this_string
#EXTINF:5,
Grab_this_string_too
#EXT-X-ENDLIST

これは次のものを置き換えます。

, Grab_this_string 
Grab_this_string_too

私は最初のコンマなしでそれを一致させようとしています(本質的に#EXTINF:xx,は次の間にあるすべてのもの#EXTINF

Grab_this_string 
Grab_this_string_too
4

1 に答える 1

2

マルチラインモードになっているので、行末を一致させて各行を描くことができます。

これは2行に一致し、それらを最初の行のみに置き換えます(事実上2番目の行を削除します)。「dotall」モード(s)を削除したことに注意してください。

$regex = '/(^#EXTINF:\d+,$)(\s+)^.+$(?=\s+^#EXT)/m';

echo preg_replace($regex, '$1', $str);

出力:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10,
#EXTINF:5,
#EXT-X-ENDLIST

アップデート:

ルックビハインドを使用すると、可変長のマッチングが必要になるため機能しません。これは、ほとんどの正規表現エンジン(PHPが使用するPCREを含む)ではサポートされていません。

削除する行のみをキャプチャし、上記のように2つの行をサブパターンの一致に置き換える必要がない場合は、\Kエスケープシーケンスを使用して、可変長の制限を受けない後読みをシミュレートできます。\K試合の開始位置をリセットするため、以前に試合が行われたもの\Kはすべて最終試合に含まれません。(ここの最後の段落を参照してください。)

$regex = '/^#EXTINF:\d+,\s+\K^.+?(?=#EXT)/sm';

echo preg_replace($regex, '', $str);
于 2012-08-05T01:55:18.933 に答える