Regex: выражение в начале строки ИЛИ НЕ
Я пытаюсь работать с некоторыми регулярными выражениями в PHP, но есть кое-что, что я не понимаю. Вот мой текст:
# fhzmvbzmvbzmb#@!
# blabla
# test
sbsfzzbg
И скажем, я хочу подчеркнуть это, как в уценке. Почему следующая функция применима только ко второй строке? Я ожидаю, что это относится и к третьей строке.
preg_replace("/\n(.*)\n/", "<h1>$1</h1>", $input_lines);
Также я хочу поймать первую строчку. Есть ли способ написать выражение, которое я пытаюсь поймать, может быть в начале строки или нет? Я думал о следующей функции, но она не работает:
preg_replace("/(^|\n)(.*)\n/", "<h1>$1</h1>", $input_lines);
Большое спасибо. Pierrick
2 ответа
Используя m
модификатор, вы можете иметь ^
а также $
применить к каждой строке:
http://www.phpliveregex.com/p/4eb
Из документации:
По умолчанию PCRE обрабатывает строку темы как состоящую из одной "строки" символов (даже если она на самом деле содержит несколько новых строк). Метасимвол "начало строки" (^) совпадает только в начале строки, а метасимвол "конец строки" ($) - только в конце строки или перед завершающим символом новой строки (если не установлен модификатор D). Это так же, как Perl. Когда этот модификатор установлен, конструкции "начало строки" и "конец строки" совпадают сразу после или непосредственно перед любой новой строкой в строке темы соответственно, а также в самом начале и конце. Это эквивалентно модификатору Perl's /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#@!