我想在给定文本中查找搜索词,并返回与html突出显示的搜索词匹配的数组。
例如:
countMatch($needle, $haystack) { ... }
鉴于needle =“foo”,而haystack“foo bar foo foo”;
代码应返回此数组:
array:3 [
0 => "<strong>foo</strong>"
1 => "<strong>foo</strong>"
2 => "<strong>foo</strong>"
]
我的代码工作正常,但我有重音和其他UTF8角色的巨大困境:
到目前为止:
/**
* Count existance of needle and return formated html string of needle
*
* @param string $needle (search term)
* @param string $haystack (text to search)
* @return string|int
*/
private function countMatch($needle, $haystack) {
$matches = array();
$response = array();
$i = 0;
preg_match_all("#(.{0,100}$needle.{0,100})#iu", $haystack, $matches);
if (!empty($matches[0])) {
foreach ($matches[0] as $match) {
$i+=1;
$response[$i] = "..." . str_ireplace($needle, "<span class='marker'>".$needle."</span>", $match) . "...";
}
return $response;
} else {
return 0;
}
}
这很好用,甚至不区分大小写。但是,如果我输入“foó”我没有匹配,或者如果我输入“foo”并且干草堆包含“fóo,我没有匹配。
预期结果:
示例1:
预期结果:
阵列:2 [ 0 =&gt; “的 FOO ” 1 =&gt; “的 FOO ” ]
示例2:
预期结果:
阵列:2 [ 0 =&gt; “......的 FOO ....” 1 =&gt; “......的 FOO ....” ]
注意:
这个正则表达式:#(.{0,100}$needle.{0,100})#iu
允许我粘贴匹配的前100个字符和后续100个字符。
是的,正如您已经猜到的,这是一个使用MariaDB / MySQL FULLTEXT INDEX的小搜索引擎,数据库对这些字符,区分大小写等没有问题。但是,由于上述问题,我无法绘制搜索结果
控制器的原始源代码: PlantaController
(内部控制器,相关功能是getPlantaAction,buildResult, countMatch ,explodeSearch)
查看(了解我如何使用Ajax绘制结果): Search form