Passende Abschnitte von zwei Strings in PHP finden

8

Ich suche nach einem einfachen Weg, passende Teile von zwei Strings in PHP zu finden (speziell im Zusammenhang mit einem URI)

Betrachten Sie zum Beispiel die zwei Zeichenfolgen:

Ссылка

und

/ ~ machinenhost / deployment_folder / users / bob / settings

Was ich brauche, ist, den übereinstimmenden Teil dieser zwei Saiten von der zweiten Saite abzuhacken, was folgendes ergibt:

Benutzer / Bob / Einstellungen

vor dem Anhängen der ersten Zeichenfolge als Präfix, eine absolute URI bilden.

Gibt es eine einfache Möglichkeit (in PHP), zwei beliebige Strings für übereinstimmende Teilstrings in ihnen zu vergleichen?

EDIT: wie gesagt, meinte ich die längste übereinstimmende Zeichenkette, die für beide Zeichenketten gemeinsam ist

    
ubermensch 25.11.2010, 23:39
quelle

6 Antworten

3

Dies wäre die Antwort. Gebrauchsfertige PHP-Funktion.

    
Jon 26.11.2010, 00:01
quelle
2

Angenommen, Ihre Strings sind $a bzw. $b , können Sie Folgendes verwenden:

%Vor%

Dieses Ergebnis ist http://2.2.2.2/~machinehost/deployment_folder/users/bob/settings .

    
cambraca 25.11.2010 23:56
quelle
0

Ich bin mir nicht sicher, ob Sie Ihre vollständige Anfrage verstanden haben, aber die Idee ist:

Sei A deine URL und B dein "/ ~ machinenhost / deployment_folder / users / bob / settings"

  • suche B in A - & gt; Sie erhalten einen Index i (wobei i die Position des ersten / von B in A ist)
  • lass l = Länge (A)
  • Sie müssen B von (l-i) auf Länge (B) schneiden, um den letzten Teil von B (/ users / bob / settings) zu übernehmen

Ich habe noch nicht getestet, aber wenn Sie wirklich brauchen, kann ich Ihnen helfen, diese brillante (ironische) Lösung funktionieren zu lassen.

Beachten Sie, dass dies mit regulären Ausdrücken wie

möglich ist %Vor%

Bearbeiten: Ich denke, dass dein letzter Kommentar meine Antwort ungültig macht. Aber was Sie wollen, ist Teilstrings zu finden. Sie können also zuerst mit einem schweren Algorithmus beginnen, der versucht, B [1: i] in A für i in {2, Länge (B)} zu finden und dann einige dynamische Programmierung Zeug.

    
Aif 25.11.2010 23:55
quelle
0

Versuchen Sie es.

Ссылка

    
oreX 26.11.2010 00:12
quelle
0

Es scheint kein Standardcode für Ihre Anforderung zu sein. Also lasst uns nach einem einfachen Weg suchen.

Für diese Übung habe ich zwei Methoden verwendet, eine für das Finden der längsten Übereinstimmung und eine weitere für das Abschneiden des passenden Teils.

Die Methode FindLonestMatch () zerlegt einen Pfad, sucht Stück für Stück nach einer Übereinstimmung im anderen Pfad und behält nur eine Übereinstimmung bei, die längste (keine Arrays, keine Sortierung). Die Methode RemoveLonestMatch () verwendet das Suffix oder den Rest nach der Position mit der längsten Übereinstimmung.

Hier der vollständige Quellcode:

%Vor%

Dies ist eine repräsentative Teilmenge von Testfällen:

%Vor%

Das Ausführen von vorherigen Testfällen liefert die folgende Ausgabe:

%Vor%

Vielleicht können Sie sich die Idee dieses Codeelements vorstellen und es in etwas verwandeln, das Sie für Ihr aktuelles Projekt nützlich finden. Lass es mich wissen, wenn es auch für dich funktioniert. By the way, Herr oreX Antwort sieht auch gut aus.

    
gral.pancho.villa 26.11.2010 03:55
quelle
0

Das Finden der längsten gemeinsamen Übereinstimmung kann auch mit regex erfolgen.

Die folgende Funktion benötigt zwei Strings, einen zum Erstellen eines Regex und den anderen zum Ausführen.

%Vor%

Es wird eine Regex mit der kürzeren der beiden Strings erzeugen, obwohl die Performance wahrscheinlich die gleiche ist. Es kann fälschlicherweise Zeichenfolgen mit wiederkehrenden Teilzeichenfolgen finden, und wir sind auf übereinstimmende Zeichenfolgen von zwei Zeichen oder mehr beschränkt. Zum Beispiel:

%Vor%

Unabhängig davon funktioniert es mit einer alternativen Methode und die Regex kann verfeinert werden, um weitere Situationen zu bewältigen.

    
Shaun Cockerill 15.12.2017 03:37
quelle

Tags und Links