我正在尝试使用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'在我的搜索中,我想让它返回相机一词。
似乎最后的单词边界不起作用,并且无法抓取字符串的结尾。
任何参赛者?
答案 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
表示不区分大小写。