Bedenken Sie:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Angenommen, ich habe den obigen Code, was ist der richtige Weg, um die Anweisung if ($a enthält 'are')
zu schreiben?
Sie können die Funktion strpos()
verwenden, die dazu dient, das Vorkommen einer Zeichenkette innerhalb einer anderen Zeichenkette zu ermitteln:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Beachten Sie, dass die Verwendung von !== false
beabsichtigt ist (weder != false
noch === true
liefert das gewünschte Ergebnis); strpos()
gibt entweder den Offset zurück, an dem die Nadelzeichenkette in der Heuhaufenzeichenkette beginnt, oder den booleschen Wert false
, wenn die Nadel nicht gefunden wird. Da 0 ein gültiger Offset ist und 0 "falsch" ist, können wir einfachere Konstrukte wie !strpos($a, 'are')
nicht verwenden.
Sie könnten reguläre Ausdrücke verwenden, da diese für die Wortübereinstimmung besser geeignet sind als strpos
, wie von anderen Benutzern erwähnt, da sie auch für Zeichenketten wie fare, care, stare usw. wahr liefern. Dies kann bei regulären Ausdrücken einfach durch die Verwendung von Wortgrenzen vermieden werden.
Eine einfache Übereinstimmung für are könnte etwa so aussehen:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
Was die Leistung angeht, so ist strpos
etwa dreimal so schnell, und bedenken Sie, als ich eine Million Vergleiche auf einmal gemacht habe, brauchte preg_match
1,5 Sekunden, um fertig zu werden, und für strpos
brauchte es 0,5 Sekunden.
Bearbeiten: Um einen beliebigen Teil der Zeichenkette zu durchsuchen, nicht nur Wort für Wort, würde ich empfehlen, einen regulären Ausdruck zu verwenden wie
$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
echo 'true';
}
Das "i" am Ende des regulären Ausdrucks macht den regulären Ausdruck unabhängig von der Groß- und Kleinschreibung, wenn Sie das nicht wollen, können Sie es weglassen.
Das kann in manchen Fällen ziemlich problematisch sein, da die Zeichenkette $search in keiner Weise bereinigt ist, d.h. sie könnte die Prüfung in manchen Fällen nicht bestehen, denn wenn $search
eine Benutzereingabe ist, kann man eine Zeichenkette hinzufügen, die sich wie ein anderer regulärer Ausdruck verhalten könnte...
Außerdem gibt es hier ein großartiges Tool zum Testen und Erklären verschiedener regulärer Ausdrücke Regex101
Um beide Funktionen in einer einzigen Mehrzweckfunktion zu kombinieren (auch mit wählbarer Groß- und Kleinschreibung), könnten Sie etwas wie dieses verwenden:
function FindString($needle,$haystack,$i,$word)
{ // $i should be "" or "i" for case insensitive
if (strtoupper($word)=="W")
{ // if $word is "W" then word search instead of string in string search.
if (preg_match("/\b{$needle}\b/{$i}", $haystack))
{
return true;
}
}
else
{
if(preg_match("/{$needle}/{$i}", $haystack))
{
return true;
}
}
return false;
// Put quotes around true and false above to return them as strings instead of as bools/ints.
}
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Note our use of ===. Simply, == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'.";
}
else {
echo "The string '$findme' was found in the string '$mystring',";
echo " and exists at position $pos.";
}
?>