通过变量定界符分割和捕获文本

时间:2019-07-02 16:45:30

标签: php regex

我有一个包含定界符标签的文本,格式如下:

<\!--[od]+-\d+--\>

示例:

<!--od-14-->
<!--od-1--\>
<!--od-65--\>

我需要一个正则表达式,它将分割文本并在分割中捕获\ d +数字参数,以及后面的文本。

这是我要使用的正则表达式,问题是它不返回多行。

https://regex101.com/r/xvw8Xw/2

2 个答案:

答案 0 :(得分:1)

一种选择是使点与换行符匹配,例如使用内联修饰符(?s)。然后使用非贪心匹配和正向超前来断言下一个注释或字符串的结尾:

(?s)<\!--[od]+-(\d+)-->(.*?)(?=<!--|$)
  • (?s)内联修饰符,使点与换行符匹配
  • <\!--匹配<!--
  • [od]+-(\d+)-->匹配o或d(可能只是od)超过1次
  • (.*?)匹配任何char 0次以上,换行符非贪心除外
  • (?=<!--|$)前瞻性,断言右边是<!--或字符串的结尾

Regex demo | Php demo

例如在模式中使用/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+)--\>(.*?)(?=<|$)

Demo

测试

$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);