2013-03-13 64 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。