Regex: выражение в начале строки ИЛИ NOT

Я пытаюсь работать с некоторым регулярным выражением в PHP, но есть кое-что, чего я не понимаю. Вот мой текст:

# fhzmvbzmvbzmb#@!
# blabla
# test
sbsfzzbg

И позвольте сказать, что хочу подчеркнуть это, как в уценке. Почему следующая функция применяется только к моей второй строке? Я ожидаю, что он применится и к третьей строке.

preg_replace("/\n(.*)\n/", "<h1>$1</h1>", $input_lines);

Кроме того, я хочу поймать первую строку. Есть ли способ написать выражение, которое я пытаюсь поймать, может быть либо в начале строки, либо нет? Я подумал о следующей функции, но она не работает:

preg_replace("/(^|\n)(.*)\n/", "<h1>$1</h1>", $input_lines);

Большое спасибо. Pierrick

Ответ 1

Используя модификатор m, вы можете использовать ^ и $ для каждой строки:

http://www.phpliveregex.com/p/4eb

Из документации:

По умолчанию PCRE обрабатывает строку subject как состоящую из одной "строки" символов (даже если она фактически содержит несколько строк новой строки). Метахарактер "начала строки" (^) соответствует только в начале строки, в то время как метасимвол "конец строки" ($) соответствует только в конце строки или перед завершающей новой строкой (если не установлен D-модификатор). Это то же самое, что и Perl. Когда этот модификатор установлен, конструкции "начало строки" и "конец строки" соответствуют сразу после или непосредственно перед любой новой строкой в ​​строке темы, соответственно, а также в самом начале и в конце. Это эквивалентно модификатору Perl/m. Если в строке субъекта нет символов "\n", или нет вхождений ^ или $в шаблоне, установка этого модификатора не влияет.

Ответ 2

Чтобы выполнить замену, вы можете сделать что-то вроде этого с помощью lookaheads и lookbehinds, чтобы они соответствовали символам новой строки. Я не уверен, как вы собираетесь захватить первую строку в том же выражении, которое вы используете для замены. Вот что я придумал:

$input_lines = '# fhzmvbzmvbzmb#@!
# blabla
# test
sbsfzzbg';

// REPLACE
$data = preg_replace("/(?<=\n)(.*)(?=\n)/m", "<h1>$1</h1>", $input_lines);
print $data;

// GET THE FIRST LINE
preg_match('/^(.*)\n/', $input_lines, $first_line_matches);

print "\n\nFirst Line: ".$first_line_matches[1];

Выводит следующее:

# fhzmvbzmvbzmb#@!
<h1># blabla
</h1>
<h1># test
</h1>
sbsfzzbg

First Line: # fhzmvbzmvbzmb#@!