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

2661

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')?

Charles Yeung
quelle

Antworten:

6892

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 !== falseabsichtlich ist (weder != falsenoch === truedas gewünschte Ergebnis zurückgibt); strpos()Gibt entweder den Versatz zurück, an dem die Nadelschnur in der Heuhaufenschnur beginnt, oder den Booleschen Wert, falsewenn 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').

Codaddict
quelle
261
Sehr spät zur Party, aber sei vorsichtig damit. Dies gibt auch true für die Zeichenfolge "Interessiert es Sie?" Zurück.
DTest
167
@DTest - na ja, natürlich wird true zurückgegeben, da der String 'are' enthält. Wenn Sie speziell nach dem Wort ARE suchen, müssen Sie weitere Überprüfungen durchführen, z. B. ob vor dem A und nach dem E ein Zeichen oder ein Leerzeichen steht.
jsherk
40
Sehr gute Kommentare oben! Ich benutze nie! = Oder ==, schließlich! == und === ist (meiner Meinung nach) die beste Option, wenn alle Aspekte berücksichtigt werden (Geschwindigkeit, Genauigkeit usw.).
Melsi
10
@jsherk Warum also nicht Regexe? So etwas wie "sind".
Giulio Muscarello
21
Ich neige dazu, dieses Problem zu vermeiden, indem ich immer benutze 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.
Equazcion
608

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:

$a = 'How are you?';

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

Auf der Leistungsseite strposist es ungefähr dreimal schneller und wenn ich eine Million Vergleiche auf einmal anstellte, dauerte es preg_match1,5 Sekunden, bis es fertig war, und strposes 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

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

Der iregulä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 $searchbesteht 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:

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.
}
Breezer
quelle
9
@ Alexander.Plutov zweitens gibst du mir eine -1 und nicht die Frage? cmon es dauert 2 Sekunden, um die Antwort zu googeln google.com/…
Breezer
64
+1 Es ist eine schreckliche Möglichkeit, nach einer einfachen Zeichenfolge zu suchen, aber viele Besucher von SO suchen nach einer Möglichkeit, nach eigenen Teilzeichenfolgen zu suchen, und es ist hilfreich, dass der Vorschlag zur Sprache gebracht wurde. Sogar das OP könnte sich zu stark vereinfacht haben - lassen Sie ihn seine Alternativen wissen.
SamGoody
72
Technisch gesehen stellt sich die Frage, wie man Wörter findet, die keine Teilzeichenfolge sind. Dies hat mir tatsächlich geholfen, da ich dies mit Regex-Wortgrenzen verwenden kann. Alternativen sind immer nützlich.
15
+1 für die Antwort und -1 für den Kommentar @ plutov.by, da strpos nur eine einzige Prüfung ist. In der Zwischenzeit können Sie viele Wörter gleichzeitig prüfen. Beispiel: preg_match (/ are | you | not /)
albanx
4
Reguläre Ausdrücke sollten das letzte Mittel sein. Von ihrer Verwendung bei trivialen Aufgaben sollte abgeraten werden. Ich bestehe darauf, seit vielen Jahren schlechten Codes gegraben haben.
Yentsun
257

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;
}
Ejunker
quelle
74
@RobinvanBaalen Tatsächlich kann es die Lesbarkeit des Codes verbessern. Downvotes sollen auch für (sehr) schlechte Antworten sein, nicht für "neutrale".
Xaqq
37
@ RobinvanBaalen-Funktionen dienen fast per Definition der Lesbarkeit (um die Idee zu vermitteln, was Sie tun). Vergleichen Sie, was besser lesbar ist: if ($email->contains("@") && $email->endsWith(".com)) { ...oderif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Brandin
3
@RobinvanBaalen in den Endregeln sollen gebrochen werden. Sonst würden sich die Leute keine neueren erfinderischen Methoden einfallen lassen :). Außerdem muss ich zugeben, dass ich Probleme habe, mich mit Dingen wie martinfowler.com zu beschäftigen. Ich denke, das Richtige ist, die Dinge selbst auszuprobieren und herauszufinden, welche Ansätze am bequemsten sind.
James P.
5
Eine andere Meinung: Eine Dienstprogrammfunktion, die Sie einfach umbrechen können, kann beim Debuggen helfen. Es weckt auch den Ruf nach guten Optimierern, die einen solchen Aufwand bei den Produktionsdienstleistungen beseitigen. Alle Meinungen haben also gültige Punkte. ;)
Tino
18
Das ist natürlich nützlich. Sie sollten dies fördern. Was passiert, wenn es in PHP 100 eine neue und schnellere Möglichkeit gibt, Zeichenfolgenpositionen zu finden? Möchten Sie alle Ihre Orte ändern, an denen Sie strpos anrufen? Oder möchten Sie nur die enthaltenen Elemente innerhalb der Funktion ändern?
Cosmin
143

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:

  • Das "sind" am Anfang von "Bereich"
  • Das "sind" am Ende von "Hase"
  • Das "sind" in der Mitte der "Tarife"

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

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

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 ist a-z, A-Z, 0-9, oder _. Das bedeutet, dass Ziffern und Unterstriche als Wortzeichen gezählt werden und solche Szenarien fehlschlagen:

  • Die "sind" in "Was denkst du?"
  • Die "sind" in "lol u dunno wut das sind4?"

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).

FtDRbwLXw6
quelle
24
Dies sollte die kanonische Antwort sein. Da wir nach Wörtern und nicht nach Teilzeichenfolgen suchen , ist Regex angemessen. Ich werde auch hinzufügen, dass \bzwei Dinge übereinstimmen, \Wdie 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 ( $)
überein
Dies sollte die richtige Antwort sein. Der Rest der Antworten wird "are" in einer Zeichenfolge wie "do you care" finden. Wie von @Dtest erwähnt
Robert Sinclair
@ RobertSinclair Ist das so schlimm? Wenn Sie mich fragen würden, ob die Zeichenfolge "kümmert es Sie" das Wort "are" enthält, würde ich "yes" sagen. Das Wort "are" ist eindeutig eine Teilzeichenfolge dieser Zeichenfolge. Das ist eine separate Frage von "" "" ist "eines der Wörter in der Zeichenfolge" kümmert es dich "" "".
Paul
@Paulpro Obwohl OP nicht angegeben hat, dass $ a eine Phrase ist, bin ich mir ziemlich sicher, dass dies impliziert wurde. Seine Frage war also, wie man das Wort in der Phrase erkennt. Nicht, wenn ein Wort ein Wort enthält, von dem ich annehmen würde, dass es meistens irrelevant ist.
Robert Sinclair
@ Jimbo es funktioniert, Sie vermissen nur die `\` 3v4l.org/ZRpYi
MetalWeirdo
125

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 ] )

<?php

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

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

?>

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 gleich ANDsind und denselben Typ haben - dh beide sind Zeichenfolgen oder beide sind Ganzzahlen.

Jose Vega
quelle
67

Schau dir anstrpos() :

<?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.";
    }
?>
Haim Evgi
quelle
62

Eine andere Option wäre die Verwendung strstr()oder stristr()wenn Ihre Suche die Groß- und Kleinschreibung nicht berücksichtigen sollte.

Glutorange
quelle
9
Ein Hinweis auf der Seite php.net/manual/en/function.strstr.php : Hinweis: Wenn Sie nur feststellen möchten, ob eine bestimmte Nadel im Heuhaufen vorkommt, verwenden Sie stattdessen die schnellere und weniger speicherintensive Funktion strpos ().
Jo Smo
@tastro Gibt es dafür seriöse Benchmarks?
Wayne Whitty
Dies mag langsamer sein, aber IMHO strstr($a, 'are')ist viel eleganter als das Hässliche strpos($a, 'are') !== false. PHP braucht wirklich eine str_contains()Funktion.
Paul Spiegel
Es macht mich
wahnsinnig,
45

Verwenden Sie die Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung mit stripos():

if (stripos($string,$stringToSearch) !== false) {
    echo 'true';
}
Shankar Damodaran
quelle
45

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()

  1. kann nicht nach mehreren Wörtern suchen
  2. Ergebnisse sind nicht eingestuft

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:

function get_corpus_index($corpus = array(), $separator=' ') {

    $dictionary = array();

    $doc_count = array();

    foreach($corpus as $doc_id => $doc) {

        $terms = explode($separator, $doc);

        $doc_count[$doc_id] = count($terms);

        // tf–idf, short for term frequency–inverse document frequency, 
        // according to wikipedia is a numerical statistic that is intended to reflect 
        // how important a word is to a document in a corpus

        foreach($terms as $term) {

            if(!isset($dictionary[$term])) {

                $dictionary[$term] = array('document_frequency' => 0, 'postings' => array());
            }
            if(!isset($dictionary[$term]['postings'][$doc_id])) {

                $dictionary[$term]['document_frequency']++;

                $dictionary[$term]['postings'][$doc_id] = array('term_frequency' => 0);
            }

            $dictionary[$term]['postings'][$doc_id]['term_frequency']++;
        }

        //from http://phpir.com/simple-search-the-vector-space-model/

    }

    return array('doc_count' => $doc_count, 'dictionary' => $dictionary);
}

function get_similar_documents($query='', $corpus=array(), $separator=' '){

    $similar_documents=array();

    if($query!=''&&!empty($corpus)){

        $words=explode($separator,$query);

        $corpus=get_corpus_index($corpus, $separator);

        $doc_count=count($corpus['doc_count']);

        foreach($words as $word) {

            if(isset($corpus['dictionary'][$word])){

                $entry = $corpus['dictionary'][$word];


                foreach($entry['postings'] as $doc_id => $posting) {

                    //get term frequency–inverse document frequency
                    $score=$posting['term_frequency'] * log($doc_count + 1 / $entry['document_frequency'] + 1, 2);

                    if(isset($similar_documents[$doc_id])){

                        $similar_documents[$doc_id]+=$score;

                    }
                    else{

                        $similar_documents[$doc_id]=$score;

                    }
                }
            }
        }

        // length normalise
        foreach($similar_documents as $doc_id => $score) {

            $similar_documents[$doc_id] = $score/$corpus['doc_count'][$doc_id];

        }

        // sort from  high to low

        arsort($similar_documents);

    }   

    return $similar_documents;
}

FALL 1

$query = 'are';

$corpus = array(
    1 => 'How are you?',
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

ERGEBNIS

Array
(
    [1] => 0.52832083357372
)

FALL 2

$query = 'are';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

ERGEBNISSE

Array
(
    [1] => 0.54248125036058
    [3] => 0.21699250014423
)

FALL 3

$query = 'we are done';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

ERGEBNISSE

Array
(
    [3] => 0.6813781191217
    [1] => 0.54248125036058
)

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()oder stristr().

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

  • Konvertieren Sie den gesamten Text in Kleinbuchstaben

2. Stoppwortbeseitigung

  • Entfernen Sie Wörter aus dem Text, die keine wirkliche Bedeutung haben (wie 'und', 'oder', 'das', 'für' usw.).

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

RafaSashi
quelle
40

Wenn Sie das Problem "Falsey" und "Truthy" vermeiden möchten, können Sie substr_count verwenden:

if (substr_count($a, 'are') > 0) {
    echo "at least one 'are' is present!";
}

Es ist etwas langsamer als strpos, aber es vermeidet die Vergleichsprobleme.

Alan Piralla
quelle
Es kehrt zurück falsefür "Bist du sicher?" da die Position für strposist0
Hafenkranich
30

Eine andere Möglichkeit ist die Verwendung der Funktion strstr () . Etwas wie:

if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}

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 () .

YashG99
quelle
1
strstr () gibt FALSE zurück, wenn die Nadel nicht gefunden wurde. Ein Strlen ist also nicht notwendig.
Ayesh K
29
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
joan16v
quelle
3
Ich WARNING preg_match(): Delimiter must not be alphanumeric or backslash
erhalte
27

Ich bin ein wenig beeindruckt , dass keine der Antworten hier , dass verwendet strpos, strstrund ä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 stattdessen mb_strposoder mb_stripos(für Matching ohne Berücksichtigung der Groß- und Kleinschreibung) verwenden:

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

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 .

Armfuß
quelle
25

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:

function contains($haystack, $needle, $caseSensitive = false) {
    return $caseSensitive ?
            (strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
            (stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}

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 : TRUEstellt sicher, dass myFunctionimmer ein Boolescher Wert zurückgegeben wird, und behebt unerwartetes Verhalten, wenn der Index der Teilzeichenfolge 0 ist.
  • $caseSensitive ? A : Bwählt entweder strposoder aus stripos, um die Arbeit zu erledigen, abhängig vom Wert von $caseSensitive.

Ausgabe:

var_dump(contains('bare','are'));            // Outputs: bool(true)
var_dump(contains('stare', 'are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are', true));    // Outputs: bool(false)
var_dump(contains('hair', 'are'));           // Outputs: bool(false)
var_dump(contains('aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are', true));  // Outputs: bool(false)
var_dump(contains('aren\'t', 'Are'));        // Outputs: bool(true)
var_dump(contains('aren\'t', 'Are', true));  // Outputs: bool(false)
var_dump(contains('broad', 'are'));          // Outputs: bool(false)
var_dump(contains('border', 'are'));         // Outputs: bool(false)
John Slegers
quelle
22

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:

<?php

if (!function_exists('is_str_contain')) {
  function is_str_contain($string, $keyword)
  {
    if (empty($string) || empty($keyword)) return false;
    $keyword_first_char = $keyword[0];
    $keyword_length = strlen($keyword);
    $string_length = strlen($string);

    // case 1
    if ($string_length < $keyword_length) return false;

    // case 2
    if ($string_length == $keyword_length) {
      if ($string == $keyword) return true;
      else return false;
    }

    // case 3
    if ($keyword_length == 1) {
      for ($i = 0; $i < $string_length; $i++) {

        // Check if keyword's first char == string's first char
        if ($keyword_first_char == $string[$i]) {
          return true;
        }
      }
    }

    // case 4
    if ($keyword_length > 1) {
      for ($i = 0; $i < $string_length; $i++) {
        /*
        the remaining part of the string is equal or greater than the keyword
        */
        if (($string_length + 1 - $i) >= $keyword_length) {

          // Check if keyword's first char == string's first char
          if ($keyword_first_char == $string[$i]) {
            $match = 1;
            for ($j = 1; $j < $keyword_length; $j++) {
              if (($i + $j < $string_length) && $keyword[$j] == $string[$i + $j]) {
                $match++;
              }
              else {
                return false;
              }
            }

            if ($match == $keyword_length) {
              return true;
            }

            // end if first match found
          }

          // end if remaining part
        }
        else {
          return false;
        }

        // end for loop
      }

      // end case4
    }

    return false;
  }
}

Prüfung:

var_dump(is_str_contain("test", "t")); //true
var_dump(is_str_contain("test", "")); //false
var_dump(is_str_contain("test", "test")); //true
var_dump(is_str_contain("test", "testa")); //flase
var_dump(is_str_contain("a----z", "a")); //true
var_dump(is_str_contain("a----z", "z")); //true 
var_dump(is_str_contain("mystringss", "strings")); //true 
Jason OOO
quelle
13
Könnten Sie mir bitte sagen, warum in aller Welt Sie eine Funktion wie diese verwenden würden, wenn strpos eine vollkommen praktikable Lösung ist? ...
sg3s
3
@ sg3s: Sie haben völlig Recht, aber Strpos basiert auch auf so etwas, außerdem habe ich es nicht für Repräsentanten gepostet, nur um ein bisschen Wissen zu teilen
Jason OOO
letzte var_dump ist falsch
Sunny
1
@Sunny: es war Tippfehler: var_dump (is_str_contain ("mystringss", "strings")); // wahr
Jason OOO
22

Sie können die strstrFunktion verwenden:

$haystack = "I know programming";
$needle   = "know";
$flag = strstr($haystack, $needle);

if ($flag){

    echo "true";
}

Ohne Verwendung einer eingebauten Funktion:

$haystack  = "hello world";
$needle = "llo";

$i = $j = 0;

while (isset($needle[$i])) {
    while (isset($haystack[$j]) && ($needle[$i] != $haystack[$j])) {
        $j++;
        $i = 0;
    }
    if (!isset($haystack[$j])) {
        break;
    }
    $i++;
    $j++;

}
if (!isset($needle[$i])) {
    echo "YES";
}
else{
    echo "NO ";
}
Arshid KV
quelle
2
Abstürze, wenn Sie das erste Wort suchen.
T30
20

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 :

function contains($text, $word)
{
    $found = false;
    $spaceArray = explode(' ', $text);

    $nonBreakingSpaceArray = explode(chr(160), $text);

    if (in_array($word, $spaceArray) ||
        in_array($word, $nonBreakingSpaceArray)
       ) {

        $found = true;
    }
    return $found;
 }

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:

$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";

Mit den obigen Beispielen beide $aund $benthält $c, aber Sie möchten möglicherweise, dass Ihre Funktion Ihnen sagt, dass nur $aenthält $c.

Decebal
quelle
1
Sie meinten wahrscheinlich: $found = falseam Anfang
Verlangsamung
1
Ihre Funktion funktioniert möglicherweise nicht, wenn das Wort mit Komma, Fragezeichen oder Punkt verknüpft ist. zB "was du siehst ist was du bekommst." und Sie möchten feststellen, ob "get" im Satz enthalten ist. Beachten Sie den Punkt neben "get". In diesem Fall gibt Ihre Funktion false zurück. Es wird empfohlen, reguläre Ausdrücke oder substr (ich denke, es wird sowieso reguläre Ausdrücke verwendet) zu verwenden, um Zeichenfolgen zu suchen / zu ersetzen.
Lichtbringer
@lightbringer Sie könnten nicht falscher mit Ihrer Empfehlung sein, was bedeutet es für Sie "es wird empfohlen"? Es gibt keine höchste Person, die empfiehlt oder bestätigt. Es geht um die Verwendung der Engine für reguläre Ausdrücke in PHP, die ein Schwarzes Loch in der Sprache selbst ist. Vielleicht möchten Sie versuchen, eine Regex-Übereinstimmung in eine Schleife zu setzen und die Ergebnisse zu vergleichen.
Decebal
Diese Antwort ist schlecht demonstriert und schlägt bei vielen erweiterten Szenarien fehl. Ich sehe keinen Vorteil darin, diese Technik zu unterhalten. Hier ist die verfeinerte benutzerdefinierte Funktion und der iterierte Aufruf: 3v4l.org/E9dfD Ich habe kein Interesse daran, dieses Wiki zu bearbeiten, da ich finde, dass es Zeitverschwendung für Forscher ist.
Mickmackusa
18

Eine andere Möglichkeit, das Auftreten eines Wortes aus einer Zeichenfolge mithilfe von strstr () und stristr () zu ermitteln, ist die folgende:

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>
Sadikhasan
quelle
Das ist rückwärts. Das iin stristrsteht für unempfindlich.
Adam Merrifield
18

Viele Antworten, die substr_countprüfen, ob das Ergebnis ist >0. Da die ifAnweisung jedoch Null als falsch betrachtet , können Sie diese Prüfung vermeiden und direkt schreiben:

if (substr_count($a, 'are')) {

Um zu überprüfen, ob nicht vorhanden, fügen Sie den !Operator hinzu:

if (!substr_count($a, 'are')) {
T30
quelle
Nun ... teilweise wahr, in PHP 0 == falsch ist wahr, aber 0 === falsch ist falsch
Andrejs Gubars
17

Dies kann auf drei verschiedene Arten erfolgen:

 $a = 'How are you?';

1- stristr ()

 if (strlen(stristr($a,"are"))>0) {
    echo "true"; // are Found
 } 

2-strpos ()

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

3- preg_match ()

 if( preg_match("are",$a) === 1) {
   echo "true"; // are Found
 }
Shashank Singh
quelle
gut, aber preg_match ist riskant, da es false oder 0 zurückgeben kann. Sie sollten in # 3
Shapeshifter
14

Die Kurzversion

$result = false!==strpos($a, 'are');
Somwang Souksavatd
quelle
5
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Bono
14

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.

$string = 'How are you?';
$array = explode(" ", $string);

if (in_array('are', $array) ) {
    echo 'Found the word';
}
DJC
quelle
5
es wird scheitern, wenn $stringistAre are, are?
Sunny
13

Sie sollten das Format ohne Berücksichtigung der Groß- und Kleinschreibung verwenden. Wenn der eingegebene Wert also in ist smalloder capskeine Rolle spielt.

<?php
$grass = "This is pratik joshi";
$needle = "pratik";
if (stripos($grass,$needle) !== false) { 

 /*If i EXCLUDE : !== false then if string is found at 0th location, 
   still it will say STRING NOT FOUND as it will return '0' and it      
   will goto else and will say NOT Found though it is found at 0th location.*/
    echo 'Contains word';
}else{
    echo "does NOT contain word";
}
?>

Hier findet Stripos Nadel im Heystack ohne Rücksicht auf Fall (Small / Caps).

PHPCode Sample mit Ausgabe

Pratik
quelle
13

Vielleicht könnten Sie so etwas gebrauchen:

<?php
    findWord('Test all OK');

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a word';
        }
        else
        {
            echo 'Did not find a word';
        }
    }
?>
Mathias Stavrou
quelle
12

Nicht verwenden, preg_match()wenn Sie nur überprüfen möchten, ob eine Zeichenfolge in einer anderen Zeichenfolge enthalten ist. Verwenden Sie strpos()oder strstr()stattdessen, da sie schneller sind. ( http://in2.php.net/preg_match )

if (strpos($text, 'string_name') !== false){
   echo 'get the string';
}
Vinod Joshi
quelle
12

Wenn Sie überprüfen möchten, ob die Zeichenfolge mehrere spezifische Wörter enthält, können Sie Folgendes tun:

$badWords = array("dette", "capitale", "rembourser", "ivoire", "mandat");

$string = "a string with the word ivoire";

$matchFound = preg_match_all("/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches);

if ($matchFound) {
    echo "a bad word has been found";
}
else {
    echo "your string is okay";
}

Dies ist nützlich, um Spam beispielsweise beim Senden von E-Mails zu vermeiden.

Julien
quelle
10

Die strpos-Funktion funktioniert einwandfrei. Wenn Sie jedoch case-insensitivein einem Absatz nach einem Wort suchen möchten, können Sie die striposFunktion von verwenden PHP.

Zum Beispiel,

$result = stripos("I love PHP, I love PHP too!", "php");
if ($result === false) {
    // Word does not exist
}
else {
    // Word exists
}

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.

Akshay Khale
quelle
9

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):

echo FALSE === strpos($a,'are') ? 'false': 'true';
Gestaltwandler
quelle
8

Überprüfen Sie, ob die Zeichenfolge bestimmte Wörter enthält.

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 ):

<?php

function contains_word($str, $word) {
  // split string into words
  // separators are substrings of at least one non-word character
  $arr = preg_split('/\W+/', $str, NULL, PREG_SPLIT_NO_EMPTY);

  // now the words can be examined each
  foreach ($arr as $value) {
    if ($value === $word) {
      return true;
    }
  }
  return false;
}

function test($str, $word) {
  if (contains_word($str, $word)) {
    echo "string '" . $str . "' contains word '" . $word . "'\n";
  } else {
    echo "string '" . $str . "' does not contain word '" . $word . "'\n" ;
  }
}

$a = 'How are you?';

test($a, 'are');
test($a, 'ar');
test($a, 'hare');

?>

Ein Lauf gibt

$ php -f test.php                   
string 'How are you?' contains word 'are' 
string 'How are you?' does not contain word 'ar'
string 'How are you?' does not contain word 'hare'

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.

Ein "Wort" -Zeichen ist ein beliebiger Buchstabe oder eine Ziffer oder ein Unterstrich, dh ein beliebiges Zeichen, das Teil eines Perl- "Wortes" sein kann. Die Definition von Buchstaben und Ziffern wird durch die Zeichentabellen von PCRE gesteuert und kann variieren, wenn ein länderspezifischer Abgleich stattfindet (..).

mvw
quelle
7

Eine andere Lösung für eine bestimmte Zeichenfolge:

$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
    echo true;
}

Sie können auch die strpos()Funktion verwenden.

devpro
quelle