2010-03-27 5 views
5

Lösung: strpos erwies sich als die effizienteste. Kann mit substr gemacht werden, aber das erstellt eine temporäre Teilzeichenfolge. Kann auch mit regex gemacht werden, aber langsamer als strpos und liefert nicht immer die richtige Antwort, wenn das Wort Meta-Zeichen enthält (siehe Ayman Hourieh Kommentar).ein Wort an Ende der Zeichenfolge mit strpos

Gewählte Antwort:

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

und am besten für strikte Gleichheit testen === (siehe David Antwort)

Vielen Dank an alle für die Unterstützung aus.


Ich versuche, in einer Zeichenfolge ein Wort zu passen, um zu sehen, ob es am Ende dieser Zeichenfolge auftritt. Die übliche strpos($theString, $theWord); würde das nicht tun.

Grundsätzlich, wenn $theWord = "my word";

$theString = "hello myword";  //match 
$theString = "myword hello";  //not match 
$theString = "hey myword hello"; //not match 

Was wäre die effizienteste Art und Weise, es zu tun?

P.S. Im Titel sagte ich strpos, aber wenn ein besserer Weg existiert, ist das auch ok.

+0

Was meinst du mit "Wort"? Leerzeichen-separierter Text? Würde der Schlüssel "foo" mit "barfoo" oder nur "bar foo" übereinstimmen? –

+0

@Nick, wenn '$ word =" foo ";' dann beide '$ sentence =" barfoo "oder" bar foo ";' sollte immer noch "übereinstimmen". In diesem Fall ist es nicht wichtig, ob davor ein Leerzeichen steht oder nicht. – clover

+0

mögliches Duplikat von [Was ist der effizienteste Test, ob eine PHP-Zeichenfolge mit einer anderen Zeichenfolge endet?] (Http://stackoverflow.com/questions/619610/whats-the-most-efficient-test-of-whether-a- php-string-ends-with-another-string) – Gajus

Antwort

5

Sie können von strrpos Funktion für diese machen:

$str = "Oh, hi O"; 
$key = "O"; 

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

oder eine Regex-basierte Lösung als:

if(preg_match("#$key$#",$str)) { 
print "$str ends in $key"; // prints Oh, hi O ends in O 
} 
+0

Die Regex-Lösung liefert nicht immer korrekte Ergebnisse. Siehe meinen Kommentar zu @ jjclarksons Antwort. –

+0

@Ayman, danke für den Hinweis. Aktualisiert die Zusammenfassung des Threads. – clover

+0

@Aryam: OP möchte ein Wort nicht nur eine beliebige Zeichenfolge übereinstimmen. Nun habe ich angenommen, ein Wort wird alphabetisch oder alphanumerisch sein. Wenn das Wort irgendeinen Char enthalten kann, von dem einige regex meta char sein können, wird das nicht funktionieren und wir müssen den metas entkommen. – codaddict

0

Sie könnten eine regular expression verwenden.

Oder Sie könnten strrpos() verwenden und die Länge des Wortes hinzufügen. (strrpos - "Finde die Position des letzten Vorkommens eines Zeichens in einer Zeichenkette") Dann sieh nach, ob das die Position des letzten Zeichens in der Zeichenkette ist.

+2

Erzeugt nicht die korrekte Ausgabe, wenn '$ theWord' Meta-Zeichen enthält. Versuchen Sie es mit '$ theWord' zum Beispiel auf' .'' gesetzt. –

+0

Ganz richtig, Sie müssten definitiv das Wort validieren und/oder Meta-Zeichen entkommen lassen. – jjclarkson

+0

Es ist wahrscheinlich langsamer als Codaddict's erste Methode auch. –

1

strpos könnte die effizienteste in einigen Fällen sein, aber man kann auch substr mit einem negativen Wert als zweiten Parameter zum Rückwärtszählen vom Ende der Zeichenfolge:

+1

Der Nachteil dieser Methode besteht darin, dass Sie eine temporäre Zeichenfolge aus dem Ergebnis "substr" erstellen. Die von codaddict erwähnte Methode strrpos ist wahrscheinlich schneller (obwohl Sie strenge Gleichheit testen möchten). – David

Verwandte Themen