我使用的是带有以下正则表达式的PHP preg_replace
:
/(?<=#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
由于您处于多行模式,因此可以匹配行尾来描绘每一行。
这将匹配两行,并仅用第一行替换它们(有效地删除了第二行)。请注意,我已经删除了"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
更新:
使用lookbacking将不起作用,因为它需要可变长度匹配,而大多数正则表达式引擎(包括PHP使用的PCRE)都不支持这种匹配。
如果您只想捕获要删除的行,而不必像上面那样用子模式匹配来替换两行,那么可以使用'K
转义序列来模拟不受可变长度限制的查找。'K
重置了比赛的开始位置,因此在'K
之前匹配的任何内容都不会包含在最终比赛中。(见最后一段)
$regex = '/^#EXTINF:'d+,'s+'K^.+?(?=#EXT)/sm';
echo preg_replace($regex, '', $str);