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

Lesezeit: 8 Minuten

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önnten reguläre Ausdrücke verwenden, da dies im Vergleich zu besser für den Wortabgleich ist strpos, wie von anderen Benutzern erwähnt. EIN strpos prüfen Auf are wird auch für Zeichenfolgen wie: fare, care, starre usw. true zurückgeben. Diese unbeabsichtigten Übereinstimmungen können in regulären Ausdrücken einfach vermieden werden, indem Wortgrenzen verwendet werden.

Ein einfaches Spiel für are könnte etwa so aussehen:

$a="How are you?";

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

Auf der Leistungsseite strpos ist etwa dreimal schneller. Als ich eine Million Vergleiche auf einmal durchführte, dauerte es preg_match 1,5 Sekunden bis zum Ende und für strpos Es dauerte 0,5 Sekunden.

Bearbeiten: Um einen beliebigen Teil der Zeichenfolge zu suchen, nicht nur Wort für Wort, würde ich die Verwendung eines regulären Ausdrucks wie empfehlen

$a="How are you?";
$search="are y";
if(preg_match("/{$search}/i", $a)) {
    echo 'true';
}

Die i am Ende des regulären Ausdrucks ändert den regulären Ausdruck so, dass die Groß-/Kleinschreibung nicht beachtet wird. Wenn Sie dies nicht möchten, können Sie es weglassen.

Nun, dies kann in einigen Fällen ziemlich problematisch sein, da der $search-String in keiner Weise bereinigt wird, ich meine, er besteht die Prüfung in einigen Fällen möglicherweise nicht so, als ob $search ist eine Benutzereingabe, die sie eine Zeichenfolge hinzufügen können, die sich wie ein anderer regulärer Ausdruck verhalten könnte …

Außerdem ist hier ein großartiges Tool zum Testen und Anzeigen von Erklärungen verschiedener regulärer Ausdrücke Regex101

Um beide Funktionalitäten in einer einzigen Mehrzweckfunktion (einschließlich wählbarer Groß- und Kleinschreibung) zu kombinieren, könnten Sie so etwas 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.
}

Eine weitere Sache, die Sie beachten sollten, ist das \b funktioniert nicht in anderen Sprachen als Englisch.

Die Erklärung dazu und die Lösung ist hier entnommen:

\b stellt den Anfang oder das Ende eines Wortes dar (Wortgrenze). Diese Regex würde auf Apfel in einem Apfelkuchen passen, aber nicht auf Apfel in Ananas, Apfelkarren oder Backäpfel.

Wie wäre es mit „Café“? Wie können wir das Wort „Café“ in Regex extrahieren? Eigentlich würde \bcafé\b nicht funktionieren. Warum? Weil „Café“ Nicht-ASCII-Zeichen enthält: é. \b kann nicht einfach mit Unicode wie समुद्र, 감사, месяц und 😉 verwendet werden.

Wenn Sie Unicode-Zeichen extrahieren möchten, sollten Sie direkt Zeichen definieren, die Wortgrenzen darstellen.

Die Antwort: (?<=[\s,.:;"']|^)UNICODE_WORD(?=[\s,.:;"']|$)

Um die Antwort in PHP zu verwenden, können Sie diese Funktion verwenden:

function contains($str, array $arr) {
    // Works in Hebrew and any other unicode characters
    // Thanks https://medium.com/@shiba1014/regex-word-boundaries-with-unicode-207794f6e7ed
    // Thanks https://www.phpliveregex.com/
    if (preg_match('/(?<=[\s,.:;"\']|^)' . $word . '(?=[\s,.:;"\']|$)/', $str)) return true;
}

Und wenn Sie nach einer Reihe von Wörtern suchen möchten, können Sie Folgendes verwenden:

function arrayContainsWord($str, array $arr)
{
    foreach ($arr as $word) {
        // Works in Hebrew and any other unicode characters
        // Thanks https://medium.com/@shiba1014/regex-word-boundaries-with-unicode-207794f6e7ed
        // Thanks https://www.phpliveregex.com/
        if (preg_match('/(?<=[\s,.:;"\']|^)' . $word . '(?=[\s,.:;"\']|$)/', $str)) return true;
    }
    return false;
}

Ab PHP 8.0.0 können Sie nun verwenden str_enthält

<?php
    if (str_contains('abc', '')) {
        echo "Checking the existence of the empty string will always 
        return true";
    }

  • @Alexander.Plutov Zweitens gibst du mir eine -1 und nicht die Frage? cmon es dauert 2 Sekunden, um die Antwort zu googeln google.com/…

    – Brise

    6. Dezember 2010 um 14:03 Uhr

  • +1 Es ist eine schreckliche Art, nach einer einfachen Zeichenfolge zu suchen, aber viele Besucher von SO suchen nach einer Möglichkeit, nach einer ihrer eigenen Teilzeichenfolgen zu suchen, und es ist hilfreich, dass der Vorschlag angesprochen wurde. Sogar das OP könnte zu stark vereinfacht haben – lassen Sie ihn seine Alternativen wissen.

    – SamGoody

    9. November 2011 um 9:53 Uhr

  • Technisch gesehen stellt sich die Frage, wie man findet Wörter kein Teilstring. Das hat mir tatsächlich geholfen, da ich dies mit Regex-Wortgrenzen verwenden kann. Alternativen sind immer sinnvoll.

    Benutzer764357

    20. August 2013 um 5:57 Uhr

  • +1 für die Antwort und -1 für den @plutov.by-Kommentar, weil strpos nur eine einzige Prüfung ist, während regexp viele Wörter gleichzeitig prüfen kann, z. B.: preg_match(/are|you|not/)

    – Albanx

    5. November 2014 um 17:05 Uhr

  • Reguläre Ausdrücke sollten der letzte Ausweg sein. Von ihrer Verwendung in trivialen Aufgaben sollte abgeraten werden. Ich bestehe darauf aus der Höhe vieler Jahre des Grabens von schlechtem Code.

    – Jentsun

    18. Februar 2015 um 14:38 Uhr


  • @RobinvanBaalen Tatsächlich kann es die Lesbarkeit des Codes verbessern. Außerdem sollen Abwertungen für (sehr) schlechte Antworten gelten, nicht für “neutrale”.

    – Xaqq

    9. Juli 2013 um 8:56 Uhr

  • @RobinvanBaalen-Funktionen dienen fast per Definition der Lesbarkeit (um die Idee dessen, was Sie tun, zu kommunizieren). Vergleichen Sie, was besser lesbar ist: if ($email->contains("@") && $email->endsWith(".com)) { ... oder if (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...

    – Brandin

    25. Juli 2013 um 12:12 Uhr

  • @RobinvanBaalen am Ende sollen Regeln gebrochen werden. Sonst würden die Leute nicht auf neuere erfinderische Wege kommen, Dinge zu tun 🙂 . Außerdem muss ich zugeben, dass ich Probleme habe, mich um Dinge wie auf martinfowler.com zu kümmern. Raten Sie, es ist richtig, Dinge selbst auszuprobieren und herauszufinden, welche Vorgehensweisen die bequemsten sind.

    – Jakob P.

    22. August 2013 um 1:43 Uhr

  • Eine andere Meinung: Eine Hilfsfunktion zu haben, die Sie einfach umschließen können, kann beim Debuggen helfen. Außerdem wird der Ruf nach guten Optimierern laut, die diesen Mehraufwand bei Produktionsdiensten eliminieren. Alle Meinungen haben also gültige Punkte. 😉

    – Tine

    20. Februar 2014 um 21:09 Uhr


  • Das ist natürlich nützlich. Sie sollten dies fördern. Was passiert, wenn es in PHP 100 einen neuen und schnelleren Weg gibt, String-Positionen zu finden? Möchten Sie alle Orte ändern, an denen Sie strpos anrufen? Oder wollen Sie nur die Inhalte innerhalb der Funktion ändern ??

    – Kosmin

    17. Juni 2015 um 9:44 Uhr


Um festzustellen, ob ein String einen anderen String 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 sich die gesuchte Nadel am Anfang des Heuhaufens befindet, kehrt sie zu Position 0 zurück, wenn Sie a == Vergleichen, das wird nicht funktionieren, Sie müssen a tun ===

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

EIN === sign ist ein Vergleich, um zu sehen, ob zwei Variablen / Ausdrücke / Konstanten gleich sind AND denselben Typ haben, dh beide sind Strings oder beide sind Integer.

  • Wenn ich “care” verwende, ist die Rückgabe auch wahr 🙁

    – Jahirul Islam Mamun

    8. August 2020 um 5:34 Uhr

Während die meisten dieser Antworten Ihnen sagen, ob ein Teilstring in Ihrem String vorkommt, ist das normalerweise nicht das, was Sie wollen, wenn Sie nach einem bestimmten suchen Wortund nicht ein Teilzeichenfolge.

Was ist der Unterschied? Teilstrings können in anderen Wörtern vorkommen:

  • Das „are“ am Anfang von „area“
  • Das „are“ am Ende von „hare“
  • Das „sind“ in der Mitte von „Tarifen“

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

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

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

  • Das “sind” in “Was _sind_ Sie denken?”
  • Das “sind” in “lol weißt du nicht, was das für are4?”

Wenn Sie etwas Genaueres als das wollen, müssen Sie anfangen, die Syntax der englischen Sprache zu analysieren, und das ist eine ziemlich große Dose von Würmern (und setzt sowieso die richtige Verwendung der Syntax voraus, was nicht immer selbstverständlich ist).

  • Wenn ich “care” verwende, ist die Rückgabe auch wahr 🙁

    – Jahirul Islam Mamun

    8. August 2020 um 5:34 Uhr

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

993180cookie-checkWie überprüfe ich, ob eine Zeichenfolge ein bestimmtes Wort enthält?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy