[英]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
更新:
使用lookbehind將不起作用,因為它需要可變長度的匹配,這在大多數正則表達式引擎(包括PHP使用的PCRE)中均不受支持。
如果您只想捕獲要刪除的行,而不必像上面一樣用子模式匹配替換兩條行,則可以使用\\K
轉義序列來模擬不受可變長度限制的后向。 \\K
重置比賽的開始位置,因此\\K
之前匹配的所有內容都不會包含在最終比賽中。 (請參見此處的最后一段 。)
$regex = '/^#EXTINF:\d+,\s+\K^.+?(?=#EXT)/sm';
echo preg_replace($regex, '', $str);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.