Как регулярное выражение тела заголовка в markdown?

#php #regex

Вопрос:

Я пытаюсь выбрать текст заголовка в уценке.

До сих пор я придумывал ### heading:n(.*?)(?=n###) , но это не работает.

Текст:

 ### heading:

here goes content

 

Демо: https://www.phpliveregex.com/p/ANy

Регулярное выражение отлично работает в JS, поэтому мне, должно быть, не хватает чего-то уникального в PHP.

Как мне заставить это регулярное выражение работать?

Комментарии:

1. Попробуй: ### heading:R (. ?)(?=R ###)

2. @anubhava нет..не работает

3. Это действительно работает

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. Это удовлетворительно ответило на ваш вопрос?