Frage Wie überprüfe ich, ob eine Zeichenfolge ein bestimmtes Wort enthält?


Erwägen:

$a = 'How are you?';

if ($a contains 'are')
    echo 'true';

Angenommen, ich habe den obigen Code, was ist der richtige Weg, um die Aussage zu schreiben if ($a contains 'are')?


2668


Ursprung


Antworten:


Du kannst den ... benutzen strpos() Funktion, die verwendet wird, um das Auftreten einer Zeichenfolge in einer anderen Zeichenfolge zu finden:

$a = 'How are you?';

if (strpos($a, 'are') !== false) {
    echo 'true';
}

Beachten Sie, dass die Verwendung von !== false ist absichtlich; strpos() gibt entweder den Versatz, bei dem die Nadelkette in der Heuhaufenkette beginnt, oder den booleschen Wert zurück false wenn die Nadel nicht gefunden wird. Da 0 ein gültiger Offset ist und 0 "falsch" ist, können wir keine einfacheren Konstrukte wie !strpos($a, 'are').


5436



Sie können reguläre Ausdrücke verwenden, es ist besser für die Wortübereinstimmung im Vergleich zu strpos, wie von anderen Benutzern erwähnt, es wird auch für Strings wie Tarif, Vorsicht, Starren usw. wahr. Dies kann einfach im regulären Ausdruck durch Wortgrenzen vermieden werden.

Eine einfache Übereinstimmung für kann in etwa so aussehen:

$a = 'How are you?';

if (preg_match('/\bare\b/',$a))
    echo 'true';

Auf der Performance-Seite ist strpos etwa drei mal schneller und wenn ich eine Million Vergleiche auf einmal gemacht habe, dauerte es preg 1,5 Sekunden, um zu beenden und für Strops dauerte es 0,5 Sekunden.


450



Hier ist eine kleine Utility-Funktion, die in solchen Situationen nützlich ist

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}

195



Während die meisten dieser Antworten Ihnen sagen werden, ob ein Teilstring in Ihrer Zeichenkette erscheint, ist das normalerweise nicht das, was Sie wollen, wenn Sie nach einem bestimmten suchen Wortund nicht a Teilzeichenfolge.

Was ist der Unterschied? Teilstrings können mit anderen Worten erscheinen:

  • Die "sind" am Anfang von "Bereich"
  • Die "sind" am Ende des "Hasen"
  • Die "sind" in der Mitte der "Tarife"

Eine Möglichkeit, dies zu verringern, wäre die Verwendung eines regulären Ausdrucks, der mit Wortgrenzen (\b):

function containsWord($str, $word)
{
    return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}

Diese Methode hat nicht die gleichen oben erwähnten Fehlalarme, aber sie hat einige eigene Randfälle. Wortgrenzen stimmen mit Nicht-Wort-Zeichen überein (\W), die alles sein werden, was nicht ist a-z, A-Z, 0-9, oder _. Das bedeutet, dass Ziffern und Unterstriche als Wortzeichen gezählt werden und Szenarien wie diese fehlschlagen:

  • Die "sind" in "Was denkst du?"
  • Die "sind" in "lol u weißt du nicht, dass diese 4 sind?"

Wenn Sie etwas genaueres als das wollen, müssen Sie mit der syntaktischen Parsing in englischer Sprache beginnen, und das ist eine ziemlich große Dose von Würmern (und nimmt sowieso die richtige Verwendung der Syntax an, was nicht immer selbstverständlich ist).


113



Um festzustellen, ob eine Zeichenfolge eine andere Zeichenfolge enthält, können Sie die PHP-Funktion verwenden strpos ().

int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

<?php

$haystack = 'how are you';
$needle = 'are';

if (strpos($haystack,$needle) !== false) {
    echo "$haystack contains $needle";
}

?>

VORSICHT:

Wenn die gesuchte Nadel am Anfang des Heuhaufens steht, wird sie die Position 0 zurückgeben, wenn Sie eine tun == Vergleichen Sie, dass das nicht funktioniert, Sie müssen ein tun ===

EIN == sign ist ein Vergleich und testet, ob die Variable / Ausdruck / Konstante links den gleichen Wert wie die Variable / Ausdruck / Konstante rechts hat.

EIN === Vorzeichen ist ein Vergleich, um zu sehen, ob zwei Variablen / Ausdrücke / Konstanten gleich sind ANDhaben den gleichen Typ - d. h. beide sind Zeichenketten oder beide sind Ganzzahlen.


92



Verwenden strstr() oder stristr() Wenn Ihre Suche zwischen Groß- und Kleinschreibung unterscheiden sollte, wäre dies eine andere Option.


57



Ansehen strpos():

<?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.";
    }
?>

55