我正在开发一个函数,用于搜索字符串中搜索给定单词列表之一。被搜索的字符串由OCR软件生成,偶尔会在字母之间添加额外的空格(取决于字体),我需要忽略它。
我目前的功能如下:
function searchSomeText($searchTerms, $stringToBeSearched)
{
$matches = array();
for($i=0; $i < count($searchTerms); ++ $i)
{
$searchTerms[$i] = substr(chunk_split($searchTerms[$i],1,"\s*"), 0, -3);
}
$searchTermsString = implode("|", $searchTerms);
if (preg_match("/\b($searchTermsString)\b/", $stringToBeSearched, $matches))
{
return $matches;
}
else { return false; }
}
'\s*'
?'\s*'
,但除了使用chunk_split()
在每<<}后添加它/ em>字符,然后从最后砍掉它?我不想仅仅从$stringToBeSearched
剥离空格,因为在大多数情况下,间距是正确的,我不希望匹配搜索词包含在另一个词内(因此'\b'
s)
答案 0 :(得分:0)
根据我对您的任务的理解,以下是我推荐的策略:
preg_quote()
。\s*
(忽略转义斜杠)。\s+
。\b
) 中。u
模式修饰符。推荐代码:(Demo)
function searchSomeText(array $searchTerms, string $stringToBeSearched): bool
{
foreach ($searchTerms as &$searchTerm) {
$searchTerm = preg_replace(
['/\\\\?\S\K(?=\S)/', '/\s+/'],
['\\s*', '\\s+'],
preg_quote($searchTerm, '/')
);
}
$pattern = '/\b(' . implode("|", $searchTerms) . ')\b/i';
echo $pattern . "\n";
return (bool)preg_match($pattern, $stringToBeSearched);
}
var_export(
searchSomeText(
['at', 'cat ', 'the'],
'The catheter in the hat'
)
);
输出:(动态正则表达式和返回值)
/\b(a\s*t|c\s*a\s*t\s+|t\s*h\s*e)\b/i
true