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

在PHP中搜索非空白正确字符串,php,regex,search,whitespace,Php,Regex,Search,Whitespace,我有一个项目,我需要找到一个字符串出现在一个大的文本体。搜索字符串已知存在于较大的文本中,但是由于我无法控制的原因,它们不是空白正确的,因为它们在某些单词之间缺少空格 例如,我要查找的字符串是(不是brown和fox之间缺少空格: 我需要在以下方面找到这一点: The quick brown fox jumps over the lazy dog. 我需要能够修改haystack,用一个识别标签包装找到的术语,这样我就可以得到如下结果: The <span class="found"&g

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

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

我需要在以下方面找到这一点:

The quick brown fox jumps over the lazy dog.
我需要能够修改haystack,用一个识别标签包装找到的术语,这样我就可以得到如下结果:

The <span class="found">quick brown fox jumps</span> over the lazy dog.
敏捷的棕色狐狸跳过了懒狗。 我曾研究过在自由间距模式下使用正则表达式,这似乎不太符合我的需要,我考虑过从搜索词中删除所有空白,并在每个字符之间添加\s*,但我认为这可能会对性能产生可怕的影响(任何正则表达式专家都能证实或否认这一点吗?)

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


谢谢

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

$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';
}

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

$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';
}

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


类似于\Ws\W*t\W*r\W*i\W*n\W*g\W的东西可以工作,但它不是很干净。如果您想实现一个不使用正则表达式的解决方案,您可以在大海捞针中迭代每个单词,并将其与搜索字符串的前n个字符进行比较,然后尝试将正在进行的单词与搜索字符串的其余部分进行匹配。一旦获得对于不匹配的字符,您将跳过单词的其余部分并开始检查下一个字符。只有当搜索字符串的最后一个字符与干草堆中的单词结尾匹配时,它才会返回完全匹配的字符。

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


类似于\Ws\W*t\W*r\W*i\W*n\W*g\W的东西可以工作,但它不是很干净。如果您想实现一个不使用正则表达式的解决方案,您可以在大海捞针中迭代每个单词,并将其与搜索字符串的前n个字符进行比较,然后尝试将正在进行的单词与搜索字符串的其余部分进行匹配。一旦获得对于一个不匹配的字符,你跳过单词的其余部分并开始检查下一个单词。如果你的搜索字符串的最后一个字符与你的草堆中单词的末尾相匹配,它只返回一个完整的匹配项。< / P>移除任何空白,然后比较它。@ Gunbo,它只工作到一个点,考虑寻找“论文”这个词。…它出现在“西斯廷教堂”如果你删除了所有的空格,那可能不是你想要的-我想这取决于你的草堆有多大,针有多小。@CD001你是对的,但没有解决办法:他在做一个近似搜索,因为他的针不在草堆里。他会得到近似的结果,包括像这样的假阳性结果…这是NKS,我已经编辑了这个问题,说明练习的对象是修改原始草堆,在那里针被去掉任何空白,然后比较它。@ GunbO,它只工作到一个点,考虑寻找“论文”这个词…它出现在“西斯廷教堂”中。如果你删除了所有的空格,那可能不是你想要的-我想这取决于你的草堆有多大,针有多小。@CD001你是对的,但没有解决办法:他在做一个近似搜索,因为他的针不在草堆里。他会得到近似的结果,包括像这样的假阳性结果…这是nks,我编辑了这个问题,以表明这个练习的目的是修改发现针头的原始草堆谢谢,但我应该提到的是,这个练习的目的是在草堆中找到的位置周围缠绕一个标签,这样做我会得到这样的结果:棕色的狐狸跳过懒惰的狗'我将修改问题以添加此信息谢谢,但我应该提到,此练习的目的是在干草堆中找到的位置周围缠绕一个标记,然后执行类似操作:快速棕色狐狸跳过懒狗。我将修改问题以添加此信息