在PHP中搜索非空白正确的字符串

时间:2013-10-01 09:08:26

标签: php regex search whitespace

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

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

quick brownfox jumps

我需要找到:

The quick brown fox jumps over the lazy dog.

我需要能够修改haystack以使用识别标签包装找到的术语,所以我最终会得到类似的内容:

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

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

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

由于

2 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分:2)

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

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