#php #regex
Вопрос:
Я пытаюсь выбрать текст заголовка в уценке.
До сих пор я придумывал ### heading:n(.*?)(?=n###)
, но это не работает.
Текст:
### heading:
here goes content
Демо: https://www.phpliveregex.com/p/ANy
Регулярное выражение отлично работает в JS, поэтому мне, должно быть, не хватает чего-то уникального в PHP.
Как мне заставить это регулярное выражение работать?
Комментарии:
1. Попробуй:
### heading:R (. ?)(?=R ###)
2. @anubhava нет..не работает
4. @anubhava да, это работает, если протестировать его на regex101, но это не так, если вы на самом деле тестируете его с помощью функций PHP preg_match. Вот почему я связался phpliveregex.com.
5. OP, на вашем сайте, который вам так нравится, есть следующее заявление об отказе от ответственности:
note: preg_match is run on each line of input.
Ответ №1:
Основная проблема заключается в том, что специальный символ регулярного .
выражения по умолчанию не соответствует символам новой строки. Кроме того, в зависимости от того, на какой платформе вы работаете, каждая строка может заканчиваться rn
вместо n
. Таким образом, регулярное выражение должно быть:
/### heading:r?n([sS]*?)(?=r?n###)/
где [sS]
будет соответствовать любому персонажу.
<?php
$text = '### heading:
here goes content
###';
preg_match('/### heading:r?n([sS]*?)(?=r?n###)/', $text, $matches);
print_r($matches);
С принтами:
Array
(
[0] => ### heading:
here goes content
[1] =>
here goes content
)
Возможно, вы даже захотите использовать в качестве регулярного выражения:
/### heading:(?:r?n) ([sS]*?)(?=(?:r?n) ###)/
Чтобы избавиться от всех начальных и конечных пустых строк, окружающих содержимое.
Комментарии:
1. Это удовлетворительно ответило на ваш вопрос?