Aktueller Standort: Startseite> Neueste Artikel> Kann die Levenshtein -Funktion mit regulären Ausdrücken verwendet werden? Neue Ideen für Fuzzy -Matching in PHP

Kann die Levenshtein -Funktion mit regulären Ausdrücken verwendet werden? Neue Ideen für Fuzzy -Matching in PHP

gitbox 2025-06-27

In PHP ist die Levenshtein -Funktion eine Funktion, mit der der Bearbeitungsabstand zwischen zwei Zeichenfolgen berechnet wird, die normalerweise zur Implementierung von Fuzzy -Matching verwendet werden. Es bewertet die Ähnlichkeit, indem die minimale Anzahl von Einfügen, Löschen und Ersetzen von Vorgängen zählt, die erforderlich sind, um von einer Zeichenfolge in eine andere zu konvertieren. Während die Levenshtein -Funktion selbst sehr nützlich ist, möchten wir sie in einigen komplexen Szenarien für Zeichenfolge in Kombination mit regelmäßigen Ausdrücken möglicherweise bei der Implementierung flexibler Fuzzy -Matching verwenden.

Was ist die Levenshtein -Funktion?

Die grundlegende Syntax der Levenshtein -Funktion lautet wie folgt:

 <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 und $ str2 sind zwei Saiten, die verglichen werden müssen.

  • Die optionalen $ cost_ins , $ cost_rep und $ cost_del repräsentieren die Kosten für Insertion-, Ersatz- und Löschvorgänge (der Standard ist 1).

Der Rückgabewert der Funktion ist eine Ganzzahl, die den Mindestoperanden darstellt, der zum Umwandeln der Zeichenfolge $ str1 in $ str2 erforderlich ist. Zum Beispiel kehrt Levenshtein ('Kitten', 'Siting') 3 zurück, da der Übergang von "Kätzchen" zu "S" drei Vorgänge erfordert: Ersetzen Sie "K" zu "S", ersetzen Sie "e" zu "i" und fügen Sie "g" hinzu.

Die Rolle regulärer Ausdrücke bei PHP

Regelmäßige Ausdrücke (REGEX) sind leistungsstarke Tools, die die Zeichenfolgenmuster übereinstimmen. In PHP werden häufig verwendete reguläre Übereinstimmungsfunktionen PREG_MATCH , PREG_MATCH_ALL , PREG_REPLACE usw. gehören. Regelmäßige Ausdrücke können für Musteranpassung, Suche, Ersatz und andere Vorgänge verwendet werden und eignen sich besonders für den Umgang mit komplexen String -Matching -Problemen.

Wie benutze ich Levenshtein mit regulären Ausdrücken?

Obwohl Levenshtein und reguläre Ausdrücke zwei leistungsstarke Werkzeuge sind, sind sie nicht natürlich "kombiniert". Levenshtein berechnet den Abstand zwischen zwei Saiten, während reguläre Ausdrücke verwendet werden, um Muster abzustimmen. Sie können sich in einigen Fällen gegenseitig ergänzen.

Beispiel 1: Fuzzy -Matching mit Levenshtein

Angenommen, wir möchten das Wort finden, das dem vom Benutzer eingegebenen Wort aus einer Zeichenfolge mit mehreren Wörtern am ähnlichsten ist. Wir können die Levenshtein -Funktion verwenden, um die Ähnlichkeit zwischen jedem Wort und der vom Benutzer eingegebenen Zeichenfolge zu berechnen, wodurch das nächste Wort ausgewählt wird.

 <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">// Fuzzy -Wörter, die vom Benutzer eingegeben wurden</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">"Die ähnlichsten Wörter sind: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>

In diesem Beispiel durchqueren wir alle Wörter, verwenden die Levenshtein -Funktion, um den Abstand vom vom Benutzer eingegebenen Wort zu berechnen, und wählen schließlich die ähnlichsten Wörter aus.

Beispiel 2: Kombination regelmäßiger Ausdrücke und Levenshtein für komplexe Fuzzy -Matching

In einigen Fällen möchten Sie zuerst einige grundlegende Muster mit regulären Ausdrücken übereinstimmen und dann über Levenshtein eine präzisere Übereinstimmung durchführen. Wenn der Benutzer beispielsweise ein grobes Muster (z. B. ein Präfix oder ein Suffix) eingibt, können Sie regelmäßige Ausdrücke verwenden, um potenzielle Übereinstimmungen herauszufiltern und dann Levenshtein zu verwenden, um die ähnlichsten Ergebnisse zu finden.

 <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">// Fuzzy -Wörter, die vom Benutzer eingegeben wurden</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">// Reguläre Ausdrücke,Match mit "ap" Das Wort, das beginnt</span></span><span>

</span><span><span class="hljs-comment">// Verwenden Sie regelmäßige Filterwörter, die dem Muster entsprechen</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">"Die ähnlichsten Wörter sind: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>

In diesem Beispiel filtern wir zuerst alle Wörter aus, die mit "AP" durch reguläre Ausdrücke beginnen, und verwenden dann Levenshtein, um die ähnlichsten Wörter weiter zu finden. Dieser Ansatz ist besonders nützlich, wenn Sie einige Übereinstimmungsbedingungen (wie Präfixe, Suffixe oder spezifische Charaktermuster) kennen, um unnötige Optionen durch reguläre Ausdrücke herauszufiltern, wodurch die Effizienz verbessert wird.

Vorteile der Verwendung normaler und Levenshteins

  1. Verbesserung der Übereinstimmung Genauigkeit : Durch reguläre Ausdrücke können Sie Strings voraberhalten, die bestimmte Bedingungen erfüllen, und dann die nächstgelegene Saite durch Levenshtein fein berechnen.

  2. Leistung optimieren : Wenn Ihr Datensatz groß ist, kann die Filterung im Voraus durch reguläre Ausdrücke Levenshtein -Berechnungen für alle Zeichenfolgen vermeiden und damit die Leistung verbessern.

  3. Flexibilität : Regelmäßige Ausdrücke können eine komplexe Musteranpassung wie die Fallempfindlichkeit, die Übereinstimmung bestimmter spezifischer Zeichensätze usw. bewältigen, während Levenshtein verwendet werden kann, um feine Ähnlichkeitsvergleiche von gefilterten Zeichenfolgen weiter zu machen.

Zusammenfassen

Obwohl Levenshtein und reguläre Ausdrücke zwei separate Tools zu sein scheinen, kann ihre Kombination PHP mit leistungsstärkeren Fuzzy -Matching -Funktionen in der tatsächlichen Entwicklung bieten. Durch die Filterung regelmäßiger Ausdrücke zuerst und dann verwendet Levenshtein , um genau zu berechnen, kann die Genauigkeit und Effizienz der Übereinstimmung effektiv verbessert werden. Abhängig von den Anforderungen können Sie die Kombination dieser beiden flexibel auswählen, um bestimmte Anwendungsszenarien besser zu erfüllen.