Я хочу найти слово «сеанс» в тексте. Но я хотел бы получить всю строку, в которой появляется это слово. До сих пор я придумал это.
$pattern="[^\\n]*session[^\\n]*"; preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);
Но я получаю сообщение об ошибке «Неизвестный модификатор * *». Есть идеи, как сделать такое регулярное выражение?
В вашем регулярном выражении отсутствуют разделители, поэтому ваша ошибка:
$pattern = "/[^\\n]*session[^\\n]*/"; // or, with single quotes, you don't need to escape \n $pattern = '/[^\n]*session[^\n]*/';
Если я правильно истолковываю ваши намерения, вы пытаетесь совместить нуль или больше не строк новой строки, а затем «сеанс», за которым следует ноль или больше строк новой строки.
Более простой (потенциально более правильный) шаблон будет следующим:
$pattern = '/^.*\bsession\b.*$/m';
То есть, с начала строки ( ^
) соответствует 0 или более любого символа ( .*
), Границы слова ( \b
), слова «сеанс», другой границы слова, другой серии символов и конец строки ( $
), совпадающий по нескольким строкам (модификатор m
).
Вы как бы заново изобрели якоря ( ^
и $
) с [^\n]
что несколько неочевидно, но пропустили границы слов, что, вероятно, не желательно, поскольку вы соответствуете любому слову, содержащему слово «сеанс» " . То есть ваш будет соответствовать строке, содержащей «сеансы» или «владения» или «навязчивые идеи» или «abcsessionxyz», где моя не будет; если это нежелательно, вы можете удалить урожай \b
/^.*session.*$/m
и наши шаблоны будут более или менее эквивалентными.
Вот доказательство концепции, нахождение всей средней линии, которая содержит слово:
<?php $lines ="This is a test of skipping the word obsessions but finding the word session in a bunch of lines of text"; $pattern = "/^.*\bsession\b.*$/m"; $matches = array(); preg_match($pattern, $lines, $matches); var_dump($matches);
Вывод:
array(1) { [0]=> string(29) "finding the word session in a" }
Ваш образец нашел бы линию «пропустить слово навязчивые идеи, но».