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

Solutions Collecting From Web of "Regex: выражение в начале строки ИЛИ NOT"

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

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

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

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

Чтобы выполнить замену, вы можете сделать что-то вроде этого с помощью 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#@!