Beim Übereinstimmung und Durchsuchen von Text müssen wir oft nicht nur genau übereinstimmende Übereinstimmungen, sondern auch eine Methode zur Identifizierung von Zeichenfolgen, die "schließen", am Zieltext identifiziert werden. PHP bietet eine sehr bequeme Funktion Levenshtein , die uns helfen kann, dieses Ziel zu erreichen und Fuzzy -Suchanfragen durchzuführen. Heute werden wir ausführlich vorstellen, wie die Levenshtein -Funktion verwendet wird, um Fuzzy -Suche durchzuführen und eine ungefähre Übereinstimmung durch PHP zu erreichen.
Levenshtein -Entfernung (auch Bearbeitungsabstand genannt) ist ein Indikator für den Unterschied zwischen zwei Zeichenfolgen. Es stellt die Anzahl der Schritte dar, die erforderlich sind, um eine Zeichenfolge mit minimalen Bearbeitungsvorgängen in eine andere umzuwandeln (einfügen, löschen, ersetzen). Je kleiner der Abstand, desto ähnlicher sind die beiden Saiten.
In PHP können wir die Levenshtein -Funktion verwenden, um den Levenshtein -Abstand zwischen zwei Zeichenfolgen zu berechnen. Die grundlegende Syntax ist wie folgt:
levenshtein(string $str1, string $str2, int $cost_ins = 1, int $cost_rep = 1, int $cost_del = 1): int
$ str1 und $ str2 sind zwei Saiten zu vergleichen.
$ cost_ins sind die Kosten für das Einfügen von Charakteren, die sich auf 1 definieren.
$ cost_rep sind die Kosten für das Ersetzen von Zeichen, die sich auf 1 definieren.
$ cost_del sind die Kosten für das Löschen von Zeichen, die sich auf 1 definieren.
Der Rückgabewert ist der Levenshtein -Abstand zwischen zwei Saiten.
Durch die Berechnung der Levenshtein -Entfernung können wir die Ähnlichkeit zwischen zwei Zeichenfolgen beurteilen. Je kleiner der Abstand, desto ähnlicher bedeutet er.
In praktischen Anwendungen bieten wir in der Regel eine "Fuzzy -Suche" -Funktion bei der Suche nach einem Schlüsselwort. Das heißt, wir möchten Inhalte finden, die den vom Benutzer eingegebenen Suchbegriffen ähnlich sind, nicht nur der genauen Übereinstimmung.
Angenommen, wir haben eine Reihe mehrerer Zeichenfolgen, und jetzt müssen wir diese ähnlichen Zeichenfolgen basierend auf den vom Benutzer eingegebenen Schlüsselwörtern finden. Wir können den Levenshtein -Abstand zwischen den einzelnen Zeichenfolge und dem Suchbegriff berechnen, indem wir das Array durchqueren und die Ergebnisse mit kleineren Entfernungen auswählen.
<?php
$searchTerm = 'apple'; // Suchbegriffe, die von Benutzern eingegeben wurden
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$threshold = 3; // Stellen Sie eine maximale Entfernungsschwelle ein,Je kleiner der Strenger ist
$results = [];
foreach ($items as $item) {
$distance = levenshtein($searchTerm, $item);
if ($distance <= $threshold) {
$results[] = $item; // Wenn die Entfernung geringer ist als die Schwelle,Es wird als Fuzzy -Match angesehen
}
}
print_r($results);
?>
In diesem Beispiel berechnen wir den Levenshtein -Abstand zwischen dem Suchbegriff Apple und jedem Element im Array. Wenn die Entfernung weniger oder gleich dem festgelegten Schwellenwert ist (z. B. 3 ), gilt das Element als ähnlich wie der Suchbegriff und addiert dem Ergebnisarray.
Die Ausgabe kann sein:
Array
(
[0] => apple pie
[1] => apple
)
Manchmal müssen wir nicht nur alle Ähnlichkeiten finden, sondern sie auch nach Ähnlichkeit sortieren, was den ähnlichen Ergebnissen vorrangig macht. Wir können dies tun, indem wir die berechneten Levenshtein -Entfernungen sortieren.
<?php
$searchTerm = 'apple'; // Suchbegriffe, die von Benutzern eingegeben wurden
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$results = [];
foreach ($items as $item) {
$distance = levenshtein($searchTerm, $item);
$results[] = ['item' => $item, 'distance' => $distance];
}
// Sortieren nach Entfernung
usort($results, function ($a, $b) {
return $a['distance'] - $b['distance'];
});
print_r($results);
?>
In diesem Beispiel berechnen wir zuerst die Levenshtein -Entfernungen jeder Zeichenfolge für den Suchbegriff und setzen sie dann in ein assoziatives Array ein. Verwenden Sie die Usort -Funktion, um die Ergebnisse nach Distanz zu sortieren, und die Elemente mit der Mindestabstand werden zuerst eingestuft.
Ausgangsergebnis:
Array
(
[0] => Array
(
[item] => apple
[distance] => 0
)
[1] => Array
(
[item] => apple pie
[distance] => 4
)
[2] => Array
(
[item] => apricot
[distance] => 5
)
[3] => Array
(
[item] => banana
[distance] => 6
)
[4] => Array
(
[item] => grape
[distance] => 6
)
)
Wie Sie sehen können, wird der Apfel mit einer Entfernung von 0 zuerst eingestuft, gefolgt von dem Element, der dem Suchbegriff am ähnlichsten ist.
Angenommen, wir müssen etwas in den Suchergebnissen mit der URL in Verbindung bringen, können wir die entsprechende URL direkt in die Zeichenfolge einbetten. Hier ist ein Beispiel:
<?php
$searchTerm = 'apple'; // Suchbegriffe, die von Benutzern eingegeben wurden
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$baseUrl = 'http://gitbox.net/search?query=';
$results = [];
foreach ($items as $item) {
$distance = levenshtein($searchTerm, $item);
if ($distance <= 3) {
$results[] = [
'item' => $item,
'url' => $baseUrl . urlencode($item) // Setzen Sie den passenden Artikel an URL Spleißen
];
}
}
print_r($results);
?>
In diesem Beispiel enthalten die Suchergebnisse nicht nur die Übereinstimmung selbst, sondern generieren auch eine URL für jede Übereinstimmung, wodurch auf eine mögliche Suchseite verweist.
Ausgangsbeispiel:
Array
(
[0] => Array
(
[item] => apple pie
[url] => http://gitbox.net/search?query=apple+pie
)
[1] => Array
(
[item] => apple
[url] => http://gitbox.net/search?query=apple
)
)
Mit der Levenshtein -Funktion können wir die Fuzzy -Suchfunktion sehr einfach implementieren. Egal, ob es sich um eine einfache Übereinstimmung oder eine sortierte Übereinstimmung handelt, die Levenshtein -Distanz kann uns helfen, die Ähnlichkeit zwischen Strings zu beurteilen. Basierend auf den tatsächlichen Bedürfnissen können wir auch Fuzzy -Übereinstimmungen mit URLs assoziieren, um die Sucherfahrung weiter zu optimieren. Ich hoffe, dieser Artikel kann Ihnen helfen, die Levenshtein -Funktion von PHP besser zu verstehen und zu verwenden und die Flexibilität und Genauigkeit Ihrer Suchfunktion zu verbessern.