1

我有一个项目,我需要在大量文本中查找字符串的出现。已知搜索字符串存在于较大的文本中,但是由于我无法控制的原因,它们不是正确的空格,因为它们在某些单词之间缺少空格。

例如,我要查找的字符串是(不是brownfox之间缺少空格:

quick brownfox jumps

我需要在以下位置找到它:

The quick brown fox jumps over the lazy dog.

我需要能够修改干草堆以使用识别标签包装找到的术语,所以我最终会得到类似的东西:

The <span class="found">quick brown fox jumps</span> over the lazy dog.

我已经研究过在自由间距模式下使用正则表达式,这似乎不太符合我的需要,我考虑从搜索词中删除所有空格并在每个字符之间添加\s*但认为这可能会对性能产生可怕的影响(任何正则表达式专家都可以确认或否认吗?)。

是否有任何可能的非正则表达式解决方案可供研究。

谢谢

4

2 回答 2

2

在这种情况下,最好的方法是删除搜索字符串和目标字符串中的所有空格。然后检查字符串是否存在:

$haystack = 'The quick brown fox jumps over the lazy dog.';
$needle = 'quick brownfox jumps';

$haystack = preg_replace("\s+", "", $haystack);
$needle = preg_replace("\s+", "", $needle);

if (strpos($haystack, $needle) !== false) {
    echo 'true';
}
于 2013-10-01T09:15:48.867 回答
2

您不能像其他人所说的那样从大海捞针中去除空白。您的搜索字符串,即使它的空格不可靠,仍然是一系列离散的单词。如果我们假设您的 haystack 中的空格是正确的,这意味着您要查找的字符串将被 haystack 中的非单词字符包围。通过去除空格,您将失去检查它的能力,并且您将获得不必要的误报。

像 \Ws\W*t\W*r\W*i\W*n\W*g\W 这样的东西会起作用,但它不是很干净。如果您想在不使用正则表达式的情况下实现解决方案,您可以遍历大海捞针中的每个单词并将其与搜索字符串的前 n 个字符进行比较,然后尝试将后续单词与搜索字符串的其余部分进行匹配。一旦你找到一个不匹配的字符,你就会跳过单词的其余部分并开始检查下一个。如果您的搜索字符串的最后一个字符与干草堆中的单词结尾匹配,它只会返回完全匹配。

于 2013-10-01T09:37:32.640 回答