Regex抓住了额外的字符


Regex grabbing extra character

我使用的是带有以下正则表达式的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);