Я пытаюсь работать с некоторым регулярным выражением в PHP, но есть кое-что, чего я не понимаю. Вот мой текст:
# fhzmvbzmvbzmb#@! # blabla # test sbsfzzbg
И, допустим, я хочу подчеркнуть это, как в уценке. Почему следующая функция применяется только к моей второй строке? Я ожидаю, что он применится и к третьей линии.
preg_replace("/\n(.*)\n/", "<h1>$1</h1>", $input_lines);
Кроме того, я хочу поймать первую строку. Есть ли способ написать выражение, которое я пытаюсь поймать, может быть либо в начале строки, либо нет? Я подумал о следующей функции, но, похоже, она не работает:
preg_replace("/(^|\n)(.*)\n/", "<h1>$1</h1>", $input_lines);
Большое спасибо. Pierrick
Используя модификатор 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#@!