RegEx Word Boundary

时间:2014-03-15 15:59:55

标签: php regex

我正在尝试使用PHP并构建搜索功能,作为对自己的测试。

我正在努力学习正则表达式。我的代码如下:

$submission = $_GET['Search'];
function scanLines($lines, $submission) {
    foreach($lines as $line) {      
        if(strpos($line,$submission)!== false){         
            preg_match_all("/\b".$submission."\b/", $line, $matches);

            var_dump($matches);
        }           
    }       
}

我有一个文本文件,每行都有一个小句子。例如,如果要搜索的行是:

'我有一台相机'

我提交' cam'在我的搜索中,我想让它返回相机一词。

似乎最后的单词边界不起作用,并且无法抓取字符串的结尾。

任何参赛者?

2 个答案:

答案 0 :(得分:3)

如果您的行是:I have a camera,并且您尝试在cam上匹配,那么您当然不能在搜索字符串的两边使用\b

除此之外,您还应该使用preg_quote来使用特殊的正则表达式符号进行匹配。

这可能对您更有效:

preg_match("/" . preg_quote($submission) . "/", $line, $matches);

编辑:根据评论,您可以执行以下操作:

function scanLines($lines, $submission) {
   found=array();
   foreach($lines as $line) {      
      // if ( preg_match_all('/\S*' . preg_quote($submission) . '\S*/', $line, $m) ) OR
      if ( preg_match_all('/\w*' . preg_quote($submission) . '\w*/', $line, $m) )
         $found[] = $m[0];
   }
   return $found;
}

答案 1 :(得分:0)

$submission上使用preg_quote。并删除最后的边界,然后让[a-z]+[a-z]*选择其余部分。

preg_match_all("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $line, $matches);

i表示不区分大小写。