2013-03-13 65 views
2

我想弄清楚是否有一个简单的方法来让一个特定的正则表达式给出匹配,除了一个字符是正确的。 (如果重要,使用PHP工作)。如何允许正则表达式与一个字符匹配

例如,对于模式“苹果”,我想找到不仅是“苹果”,但也“appxes”,“opples”,“APPLIS”等

的出现有什么好办法完成这个?提前致谢!

回答

5

使用levenshtein函数代替正则表达式。 Here are the docs

打开示例echo levenshtein("abcd","abce")1

编辑:请注意,此函数将比较不同长度的字符串,因此可能需要额外的检查。请参阅下面的@ Vulcan的评论。

+1

+1我不知道这存在! – 2013-03-13 18:23:43

+1

值得注意的是'levenshtein(“abcd”,“abcde”)'也是'1'。该功能不仅考虑交换字符;它也包含额外/缺失的字符。如果这种额外的功能是不受欢迎的,那么可以添加一个简单的过滤器,如果这两个串的长度相同,则这个过滤器只能继续使用“levenshtein”。 – Vulcan 2013-03-13 18:26:58

+0

知道的很好的功能,谢谢。这里唯一的问题是,根据我的情况,它的效果并不好。例如,考虑一个字符串“这里有一些applis和橙子。”我想为“苹果”模式匹配“applis”,而不是仅仅确定“applis”和主模式之间的Levenshtein距离是1。也就是说,我们首先需要在上下文中找到“applis”。 – 2013-03-13 19:08:00

1

您正则表达式的字符串:

[A-z]pples|A[A-z]ples|Ap[A-z]les|Appl[A-z]es|Appl[A-z]s|Apple[A-z] 
2

我不认为正则表达式是这个合适的工具。您可以改为像这样做。

$temp = str_split ("apples"); 
$test = str_split ("appxes"); 
var_dump(array_diff($temp, $test)); 

输出:

array(1) { [3]=> string(1) "l" } // 1 mismatch 
      ^// position ^//letter at mismatch 
+1

换句话说,检查'count(array_diff(..))== 1'? – Vulcan 2013-03-13 18:24:08

+0

这是一个体面的方法,虽然它归结为levenshtein距离的原始版本。 – 2013-03-13 18:25:20

+0

@Vulcan是的。但'levenshtein'似乎好多了。 – 2013-03-13 18:25:40

0

你可以将字符串溢出X个字母,并且preg匹配来自愿望preg匹配词的X-1。