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#@!