Erwägen:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Angenommen, ich habe den obigen Code. Wie schreibe ich die Anweisung richtig if ($a contains 'are')
?
Sie können die strpos()
Funktion verwenden, mit der das Auftreten einer Zeichenfolge in einer anderen gefunden wird:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Beachten Sie, dass die Verwendung von !== false
absichtlich ist (weder != false
noch === true
das gewünschte Ergebnis zurückgibt); strpos()
Gibt entweder den Versatz zurück, an dem die Nadelschnur in der Heuhaufenschnur beginnt, oder den Booleschen Wert, false
wenn die Nadel nicht gefunden wird. Da 0 ein gültiger Offset und 0 "falsey" ist, können wir keine einfacheren Konstrukte wie verwenden !strpos($a, 'are')
.
strpos($a, 'are') > -1
, um auf wahr zu testen. Aus Debugging-Sicht verschwendet mein Gehirn weniger Taktzyklen, um festzustellen, ob die Zeile korrekt geschrieben ist, wenn ich keine zusammenhängenden Gleichheitszeichen zählen muss.Sie können reguläre Ausdrücke verwenden
strpos
. Dies ist besser für die Wortübereinstimmung als von anderen Benutzern erwähnt. Es wird auch für Zeichenfolgen wie Tarif, Pflege, Blick usw. als wahr zurückgegeben. Dies kann bei regulären Ausdrücken einfach vermieden werden, indem Wortgrenzen verwendet werden.Ein einfaches Match für are könnte ungefähr so aussehen:
Auf der Leistungsseite
strpos
ist es ungefähr dreimal schneller und wenn ich eine Million Vergleiche auf einmal anstellte, dauerte espreg_match
1,5 Sekunden, bis es fertig war, undstrpos
es dauerte 0,5 Sekunden.Bearbeiten: Um einen beliebigen Teil der Zeichenfolge zu durchsuchen, nicht nur Wort für Wort, würde ich die Verwendung eines regulären Ausdrucks wie empfehlen
Der
i
reguläre Ausdruck am Ende des regulären Ausdrucks ändert die Groß- und Kleinschreibung nicht. Wenn Sie dies nicht möchten, können Sie ihn weglassen.Dies kann in einigen Fällen recht problematisch sein, da die $ -Suchzeichenfolge in keiner Weise bereinigt ist. Ich meine, in einigen Fällen
$search
besteht sie die Prüfung möglicherweise nicht, als ob es sich um eine Benutzereingabe handelt, mit der sie eine Zeichenfolge hinzufügen können, die sich möglicherweise so verhält ein anderer regulärer Ausdruck ...Hier ist auch ein großartiges Tool zum Testen und Anzeigen von Erklärungen für verschiedene reguläre Ausdrücke Regex101
Um beide Funktionssätze in einer einzigen Mehrzweckfunktion zu kombinieren (auch mit wählbarer Groß- / Kleinschreibung), können Sie Folgendes verwenden:
quelle
Hier ist eine kleine Utility-Funktion, die in solchen Situationen nützlich ist
quelle
if ($email->contains("@") && $email->endsWith(".com)) { ...
oderif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Während die meisten dieser Antworten Ihnen sagen, ob ein Teilstring in Ihrer Zeichenfolge erscheint, ist dies normalerweise nicht das, was Sie wollen, wenn Sie nach einem bestimmten Wort suchen , und nicht nach einem Teilstring .
Was ist der Unterschied? Teilzeichenfolgen können mit anderen Worten erscheinen:
Eine Möglichkeit, dies zu mildern, wäre die Verwendung eines regulären Ausdrucks in Verbindung mit Wortgrenzen (
\b
):Diese Methode hat nicht die gleichen Fehlalarme wie oben angegeben, aber einige eigene Randfälle. Wortgrenzen passen auf Nicht-Wort - Zeichen (
\W
), die alles sein wird , die nicht ista-z
,A-Z
,0-9
, oder_
. Das bedeutet, dass Ziffern und Unterstriche als Wortzeichen gezählt werden und solche Szenarien fehlschlagen:Wenn Sie etwas genaueres als dies wünschen, müssen Sie mit dem Parsen der englischen Syntax beginnen, und das ist eine ziemlich große Dose Würmer (und setzt sowieso die richtige Verwendung der Syntax voraus, was nicht immer selbstverständlich ist).
quelle
\b
zwei Dinge übereinstimmen,\W
die nicht übereinstimmen , was es großartig macht, Wörter in einer Zeichenfolge zu finden: Es stimmt mit dem Anfang von Zeichenfolge (^
) und dem Ende von Zeichenfolge ($
)Um festzustellen, ob eine Zeichenfolge eine andere Zeichenfolge enthält, können Sie die PHP-Funktion strpos () verwenden .
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
VORSICHT:
Befindet sich die gesuchte Nadel am Anfang des Heuhaufens, wird Position 0 zurückgegeben. Wenn Sie einen
==
Vergleich durchführen, der nicht funktioniert, müssen Sie eine durchführen===
Ein
==
Vorzeichen ist ein Vergleich und prüft, ob die Variable / Ausdruck / Konstante links den gleichen Wert hat wie die Variable / Ausdruck / Konstante rechts.Ein
===
Vorzeichen ist ein Vergleich, um festzustellen, ob zwei Variablen / Ausdrücke / Konstanten gleichAND
sind und denselben Typ haben - dh beide sind Zeichenfolgen oder beide sind Ganzzahlen.quelle
Schau dir an
strpos()
:quelle
Eine andere Option wäre die Verwendung
strstr()
oderstristr()
wenn Ihre Suche die Groß- und Kleinschreibung nicht berücksichtigen sollte.quelle
strstr($a, 'are')
ist viel eleganter als das Hässlichestrpos($a, 'are') !== false
. PHP braucht wirklich einestr_contains()
Funktion.Verwenden Sie die Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung mit
stripos()
:quelle
Peer to SamGoody und Lego Stormtroopr Kommentare.
Wenn Sie nach einem PHP-Algorithmus suchen, mit dem Suchergebnisse basierend auf der Nähe / Relevanz mehrerer Wörter eingestuft werden können, bietet sich eine schnelle und einfache Möglichkeit, Suchergebnisse nur mit PHP zu generieren:
Probleme mit den anderen boolean Suchmethoden wie
strpos()
,preg_match()
,strstr()
oderstristr()
PHP-Methode basierend auf Vector Space Model und tf-idf (Begriff Frequenz-inverse Dokumentfrequenz):
Es klingt schwierig, ist aber überraschend einfach.
Wenn wir nach mehreren Wörtern in einer Zeichenfolge suchen möchten, besteht das Hauptproblem darin, wie wir jedem von ihnen eine Gewichtung zuweisen.
Wenn wir die Begriffe in einer Zeichenfolge danach gewichten könnten, wie repräsentativ sie für die gesamte Zeichenfolge sind, könnten wir unsere Ergebnisse nach denjenigen sortieren, die am besten zur Abfrage passen.
Dies ist die Idee des Vektorraummodells, nicht weit von der Funktionsweise der SQL-Volltextsuche entfernt:
FALL 1
ERGEBNIS
FALL 2
ERGEBNISSE
FALL 3
ERGEBNISSE
Es gibt viele Verbesserungen vorgenommen werden , aber das Modell bietet eine Möglichkeit , gute Ergebnisse aus natürlichen Abfragen zu bekommen, die Booleschen Operatoren haben nicht wie
strpos()
,preg_match()
,strstr()
oderstristr()
.NOTA BENE
Optionales Entfernen der Redundanz vor dem Suchen der Wörter
Dadurch wird die Indexgröße reduziert und der Speicherbedarf verringert
weniger Festplatten-E / A.
schnellere Indizierung und damit schnellere Suche.
1. Normalisierung
2. Stoppwortbeseitigung
3. Wörterbuchersetzung
Ersetzen Sie Wörter durch andere, die eine identische oder ähnliche Bedeutung haben. (Beispiel: Ersetzen Sie Fälle von "hungrig" und "hungrig" durch "Hunger".)
Weitere algorithmische Maßnahmen (Schneeball) können durchgeführt werden, um Wörter weiter auf ihre wesentliche Bedeutung zu reduzieren.
Das Ersetzen von Farbnamen durch ihre hexadezimalen Äquivalente
Die Reduzierung numerischer Werte durch Reduzierung der Genauigkeit ist eine weitere Möglichkeit, den Text zu normalisieren.
RESSOURCEN
quelle
Wenn Sie das Problem "Falsey" und "Truthy" vermeiden möchten, können Sie substr_count verwenden:
Es ist etwas langsamer als strpos, aber es vermeidet die Vergleichsprobleme.
quelle
false
für "Bist du sicher?" da die Position fürstrpos
ist0
Eine andere Möglichkeit ist die Verwendung der Funktion strstr () . Etwas wie:
Hinweis: Bei der Funktion strstr () wird zwischen Groß- und Kleinschreibung unterschieden. Verwenden Sie für eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung die Funktion stristr () .
quelle
quelle
WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Ich bin ein wenig beeindruckt , dass keine der Antworten hier , dass verwendet
strpos
,strstr
und ähnliche Funktionen erwähnt Multibyte String - Funktionen noch (2015.05.08).Wenn Sie Probleme haben, Wörter mit bestimmten Sprachen zu finden , z. B. Deutsch, Französisch, Portugiesisch, Spanisch usw. (z. B. ä , é , ô , ç , º , ñ ), sollten Sie vorangestellt werden die Funktionen mit
mb_
. Daher würde die akzeptierte Antwort stattdessenmb_strpos
odermb_stripos
(für Matching ohne Berücksichtigung der Groß- und Kleinschreibung) verwenden:Wenn Sie nicht garantieren können, dass alle Ihre Daten zu 100% in UTF-8 enthalten sind , können Sie die
mb_
Funktionen verwenden.Ein guter Artikel, um zu verstehen, warum das absolute Minimum ist. Jeder Softwareentwickler muss unbedingt über Unicode und Zeichensätze (keine Ausreden!) Von Joel Spolsky Bescheid wissen .
quelle
In PHP können Sie am besten überprüfen, ob eine Zeichenfolge eine bestimmte Teilzeichenfolge enthält, indem Sie eine einfache Hilfsfunktion wie die folgende verwenden:
Erläuterung:
strpos
findet die Position des ersten Auftretens eines Teilstrings mit Groß- und Kleinschreibung in einer Zeichenfolge.stripos
findet die Position des ersten Auftretens eines Teilstrings ohne Berücksichtigung der Groß- und Kleinschreibung in einer Zeichenfolge.myFunction($haystack, $needle) === FALSE ? FALSE : TRUE
stellt sicher, dassmyFunction
immer ein Boolescher Wert zurückgegeben wird, und behebt unerwartetes Verhalten, wenn der Index der Teilzeichenfolge 0 ist.$caseSensitive ? A : B
wählt entwederstrpos
oder ausstripos
, um die Arbeit zu erledigen, abhängig vom Wert von$caseSensitive
.Ausgabe:
quelle
Die folgende Funktion funktioniert ebenfalls und hängt von keiner anderen Funktion ab. Es wird nur die native Manipulation von PHP-Strings verwendet. Persönlich empfehle ich dies nicht, aber Sie können sehen, wie es funktioniert:
Prüfung:
quelle
Sie können die
strstr
Funktion verwenden:Ohne Verwendung einer eingebauten Funktion:
quelle
Ich hatte einige Probleme damit und entschied mich schließlich, meine eigene Lösung zu erstellen. Ohne Verwendung der Engine für reguläre Ausdrücke :
Möglicherweise stellen Sie fest, dass die vorherigen Lösungen keine Antwort auf das Wort sind, das als Präfix für ein anderes verwendet wird. Um Ihr Beispiel zu verwenden:
Mit den obigen Beispielen beide
$a
und$b
enthält$c
, aber Sie möchten möglicherweise, dass Ihre Funktion Ihnen sagt, dass nur$a
enthält$c
.quelle
$found = false
am AnfangEine andere Möglichkeit, das Auftreten eines Wortes aus einer Zeichenfolge mithilfe von strstr () und stristr () zu ermitteln, ist die folgende:
quelle
i
instristr
steht für unempfindlich.Viele Antworten, die
substr_count
prüfen, ob das Ergebnis ist>0
. Da dieif
Anweisung jedoch Null als falsch betrachtet , können Sie diese Prüfung vermeiden und direkt schreiben:Um zu überprüfen, ob nicht vorhanden, fügen Sie den
!
Operator hinzu:quelle
Dies kann auf drei verschiedene Arten erfolgen:
1- stristr ()
2-strpos ()
3- preg_match ()
quelle
Die Kurzversion
quelle
Um ein "Wort" zu finden, anstatt das Auftreten einer Reihe von Buchstaben, die tatsächlich Teil eines anderen Wortes sein könnten, wäre das Folgende eine gute Lösung.
quelle
$string
istAre are, are?
Sie sollten das Format ohne Berücksichtigung der Groß- und Kleinschreibung verwenden. Wenn der eingegebene Wert also in ist
small
odercaps
keine Rolle spielt.Hier findet Stripos Nadel im Heystack ohne Rücksicht auf Fall (Small / Caps).
PHPCode Sample mit Ausgabe
quelle
Vielleicht könnten Sie so etwas gebrauchen:
quelle
Nicht verwenden,
preg_match()
wenn Sie nur überprüfen möchten, ob eine Zeichenfolge in einer anderen Zeichenfolge enthalten ist. Verwenden Siestrpos()
oderstrstr()
stattdessen, da sie schneller sind. ( http://in2.php.net/preg_match )quelle
Wenn Sie überprüfen möchten, ob die Zeichenfolge mehrere spezifische Wörter enthält, können Sie Folgendes tun:
Dies ist nützlich, um Spam beispielsweise beim Senden von E-Mails zu vermeiden.
quelle
Die strpos-Funktion funktioniert einwandfrei. Wenn Sie jedoch
case-insensitive
in einem Absatz nach einem Wort suchen möchten, können Sie diestripos
Funktion von verwendenPHP
.Zum Beispiel,
Suchen Sie die Position des ersten Auftretens eines Teilstrings ohne Berücksichtigung der Groß- und Kleinschreibung in einer Zeichenfolge.
Wenn das Wort in der Zeichenfolge nicht vorhanden ist, wird false zurückgegeben, andernfalls wird die Position des Wortes zurückgegeben.
quelle
Sie müssen identische / nicht identische Operatoren verwenden, da strpos 0 als Indexwert zurückgeben kann. Wenn Sie ternäre Operatoren mögen, sollten Sie Folgendes in Betracht ziehen (scheint ein wenig rückwärts zu sein, gebe ich zu):
quelle
Dies bedeutet, dass die Zeichenfolge in Wörter aufgelöst werden muss (siehe Hinweis unten).
Eine Möglichkeit, dies zu tun und die Trennzeichen anzugeben, ist die Verwendung von
preg_split
( doc ):Ein Lauf gibt
Hinweis: Hier meinen wir nicht Wort für jede Folge von Symbolen.
Eine praktische Definition von Wort ist in dem Sinne die PCRE-Engine für reguläre Ausdrücke, bei der Wörter Teilzeichenfolgen sind, die nur aus Wortzeichen bestehen und durch Nichtwortzeichen getrennt sind.
quelle
Eine andere Lösung für eine bestimmte Zeichenfolge:
Sie können auch die
strpos()
Funktion verwenden.quelle