Разделить и поймать текст с помощью разделителя переменных - PullRequest
2 голосов
/ 02 июля 2019

У меня есть текст, который включает теги-разделители в следующем формате:

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

Пример:

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

Мне нужно регулярное выражение, которое разделит текст и поймает \ d +числовой аргумент в разбиении, а также текст после него.

Приведу регулярное выражение, проблема в том, что он не возвращает несколько строк.

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

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Один из вариантов - сопоставить точку с новой строкой, используя, например, встроенный модификатор (?s).Затем используйте не жадное совпадение с положительным прогнозом для подтверждения следующего комментария или конца строки:

(?s)<\!--[od]+-(\d+)-->(.*?)(?=<!--|$)
  • (?s) Встроенный модификатор, сделайте совпадение точки новой строкой
  • <\!-- совпадение <!--
  • [od]+-(\d+)--> совпадение 1+ раз либо o, либо d (что может быть просто od)
  • (.*?) совпадение с любым символом 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);
0 голосов
/ 02 июля 2019

Это выражение также может работать здесь в режиме 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...