當前位置: 首頁> 最新文章列表> levenshtein 函數能和正則表達式一起用嗎? PHP 模糊匹配新思路

levenshtein 函數能和正則表達式一起用嗎? PHP 模糊匹配新思路

gitbox 2025-06-27

在PHP 中, levenshtein函數是一個用於計算兩個字符串之間的編輯距離的函數,通常用於實現模糊匹配。它通過計算從一個字符串轉換到另一個字符串所需的插入、刪除和替換操作的最少次數來評估相似性。雖然levenshtein函數本身非常有用,但在一些複雜的字符串匹配場景中,我們可能會想要將它與正則表達式結合使用,以便在實現靈活的模糊匹配時,獲得更強大的能力。

什麼是levenshtein 函數?

levenshtein函數的基本語法如下:

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$cost_ins</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$cost_rep</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$cost_del</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> ] )
</span></span>
  • $str1$str2是要進行比較的兩個字符串。

  • 可選的$cost_ins$cost_rep$cost_del分別表示插入、替換和刪除操作的費用(默認都是1)。

函數的返回值是一個整數,表示將字符串$str1轉換為$str2所需的最小操作數。例如, levenshtein('kitten', 'sitting')會返回3,因為“kitten”到“sitting”的轉變需要三次操作:替換“k”為“s”、替換“e”為“i”、以及添加“g”。

正則表達式在PHP 中的作用

正則表達式(RegEx)是用來匹配字符串模式的強大工具。在PHP 中,常用的正則匹配函數有preg_matchpreg_match_allpreg_replace等。正則表達式可以用於模式匹配、查找、替換等操作,特別適合處理複雜的字符串匹配問題。

如何將levenshtein 和正則表達式結合使用?

儘管levenshtein和正則表達式是兩個功能強大的工具,但它們並不是天然“結合”的。 levenshtein是計算兩個字符串之間的距離,而正則表達式是用於匹配模式。它們可以在某些情況下互相補充。

示例1:用levenshtein進行模糊匹配

假設我們要從一個包含若干個單詞的字符串中找到與用戶輸入的單詞最相似的單詞。我們可以通過levenshtein函數計算每個單詞與用戶輸入的字符串之間的相似度,從而選擇最接近的單詞。

 <span><span><span class="hljs-variable">$words</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"orange"</span></span><span>, </span><span><span class="hljs-string">"grape"</span></span><span>, </span><span><span class="hljs-string">"kiwi"</span></span><span>];
</span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-string">"applw"</span></span><span>; </span><span><span class="hljs-comment">// 用戶輸入的模糊單詞</span></span><span>

</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$min_distance</span></span><span> = PHP_INT_MAX;

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$words</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$word</span></span><span>) {
    </span><span><span class="hljs-variable">$distance</span></span><span> = </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, </span><span><span class="hljs-variable">$word</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$distance</span></span><span> &lt; </span><span><span class="hljs-variable">$min_distance</span></span><span>) {
        </span><span><span class="hljs-variable">$min_distance</span></span><span> = </span><span><span class="hljs-variable">$distance</span></span><span>;
        </span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-variable">$word</span></span><span>;
    }
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"最相似的單詞是: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>

在這個例子中,我們遍歷了所有單詞,使用levenshtein函數計算與用戶輸入的單詞的距離,並最終選出了最相似的單詞。

示例2:結合正則表達式和levenshtein進行複雜的模糊匹配

在某些情況下,您可能希望首先通過正則表達式匹配一些基本的模式,再通過levenshtein進行更精確的匹配。例如,如果用戶輸入了一個大致的模式(如前綴或後綴),您可以用正則表達式來過濾出潛在的匹配項,然後再使用levenshtein來找到最相似的結果。

 <span><span><span class="hljs-variable">$words</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"orange"</span></span><span>, </span><span><span class="hljs-string">"grape"</span></span><span>, </span><span><span class="hljs-string">"kiwi"</span></span><span>];
</span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-string">"applw"</span></span><span>; </span><span><span class="hljs-comment">// 用戶輸入的模糊單詞</span></span><span>
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">"/^ap/"</span></span><span>; </span><span><span class="hljs-comment">// 正則表達式,匹配以 "ap" 開頭的單詞</span></span><span>

</span><span><span class="hljs-comment">// 使用正則過濾出符合模式的單詞</span></span><span>
</span><span><span class="hljs-variable">$matches</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_grep</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$words</span></span><span>);

</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$min_distance</span></span><span> = PHP_INT_MAX;

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$matches</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$match</span></span><span>) {
    </span><span><span class="hljs-variable">$distance</span></span><span> = </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, </span><span><span class="hljs-variable">$match</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$distance</span></span><span> &lt; </span><span><span class="hljs-variable">$min_distance</span></span><span>) {
        </span><span><span class="hljs-variable">$min_distance</span></span><span> = </span><span><span class="hljs-variable">$distance</span></span><span>;
        </span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-variable">$match</span></span><span>;
    }
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"最相似的單詞是: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>

在這個例子中,我們首先通過正則表達式過濾出所有以“ap”開頭的單詞,然後使用levenshtein來進一步找到最相似的單詞。這種方法特別適用於當你知道一些匹配條件(例如前綴、後綴或特定的字符模式)時,通過正則表達式過濾掉不必要的選項,從而提高效率。

使用正則與levenshtein的優勢

  1. 提高匹配準確性:通過正則表達式,你可以預先篩選出符合一定條件的字符串,再通過levenshtein精細地計算最接近的字符串。

  2. 優化性能:如果你的數據集很大,通過正則表達式提前篩選匹配項,可以避免對所有字符串都進行levenshtein計算,從而提高性能。

  3. 靈活性:正則表達式可以處理複雜的模式匹配,比如區分大小寫、匹配某些特定字符集等,而levenshtein可以用於進一步對篩選出的字符串進行精細的相似度比較。

總結

雖然levenshtein和正則表達式看似是兩個獨立的工具,但在實際開發中,它們的結合可以為PHP 提供更強大的模糊匹配能力。通過正則表達式先行篩選,接著用levenshtein精確計算,可以有效提升匹配的準確度與效率。根據需求不同,可以靈活選擇這兩者的組合方式,從而更好地滿足特定的應用場景。