我有一个包含定界符标签的文本,格式如下:
<\!--[od]+-\d+--\>
示例:
<!--od-14-->
<!--od-1--\>
<!--od-65--\>
我需要一个正则表达式,它将分割文本并在分割中捕获\ d +数字参数,以及后面的文本。
这是我要使用的正则表达式,问题是它不返回多行。
答案 0 :(得分:1)
一种选择是使点与换行符匹配,例如使用内联修饰符(?s)
。然后使用非贪心匹配和正向超前来断言下一个注释或字符串的结尾:
(?s)<\!--[od]+-(\d+)-->(.*?)(?=<!--|$)
(?s)
内联修饰符,使点与换行符匹配<\!--
匹配<!--
[od]+-(\d+)-->
匹配o或d(可能只是od)超过1次(.*?)
匹配任何char 0次以上,换行符非贪心除外(?=<!--|$)
前瞻性,断言右边是<!--
或字符串的结尾例如在模式中使用/s
:
$re = '/<\!--[od]+-(\d+)-->(.*?)(?=<!--|$)/s';
$str = '<!--od-1--> cdskc sdkjc
dsd
sk<!--od-2-->cscdscsdcsd
cdscs
csdcsdc
<!--od-432-->cdcdscsd';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r($matches);
答案 1 :(得分:0)
此表达式在m
模式下也可以在这里使用:
<!--od-(\d+)--\>([\s\S]*?)(?=<|$)
或在s
模式下使用此模式:
<!--od-(\d+)--\>(.*?)(?=<|$)
$re = '/<!--od-(\d+)--\>(.*?)(?=<|$)/s';
$str = '<!--od-1--> cdskc sdkjc
dsd
sk<!--od-2-->cscdscsdcsd
cdscs
csdcsdc
<!--od-432-->cdcdscsd';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);