我想在文本中搜索单词“会话”。但我想检索出现这个词的整行。到目前为止,我已经想出了这个。
$pattern="[^\\n]*session[^\\n]*";
preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);
但我收到一个错误“未知修饰符'*'”。任何想法如何制作这样的正则表达式?
我想在文本中搜索单词“会话”。但我想检索出现这个词的整行。到目前为止,我已经想出了这个。
$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]
这有点不明显,但错过了单词边界,这可能是不希望的,因为您正在匹配任何包含单词 "session" 的单词。也就是说,你的会匹配包含“sessions”或“possessions”或“obsessions”或“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"
}
您的模式会找到“跳过单词强迫症但是”这一行。