我想在文本中搜索单词“会话”。但是我想检索这个词出现的整个行。到目前为止,我已经提出了这个问题。用php正则表达式查找包含单词的整行
$pattern="[^\\n]*session[^\\n]*";
preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);
但是我得到一个错误“Unknown modifier'*'”。任何想法如何做出这样的正则表达式?
我想在文本中搜索单词“会话”。但是我想检索这个词出现的整个行。到目前为止,我已经提出了这个问题。用php正则表达式查找包含单词的整行
$pattern="[^\\n]*session[^\\n]*";
preg_match_all($pattern,$content, $matches, PREG_OFFSET_CAPTURE);
但是我得到一个错误“Unknown modifier'*'”。任何想法如何做出这样的正则表达式?
你的正则表达式中缺少分隔符,因此你的错误:
$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]
这是有点不明显改造了锚(^
和$
),但错过了字边界,它为你匹配any word that contains the word "session"可能是不希望的。也就是说,你的会匹配一个包含“会话”或“财产”或“执着”或“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"
}
你的模式会发现跳过字线” “但是”。
谢谢,我有一个问题是什么?b(边界)真的吗?这不是一个白色空间,我知道的不多。 –
单词边界在[here](http://www.regular-expressions.info/wordboundaries.html)中有描述,但基本上两个字符之间的任意位置,其中一个是单词字符('[a-zA-Z0-9_] ),一个不是。值得注意的是我们的模式并不相同,你的将匹配“blahsessionblah”,我的不会。 – meagar
@BorutFlis更新了我的答案,以证明为什么字边界很重要。 – meagar