it-swarm.com.de

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. Wie kann ich die Anweisung if ($a contains 'are') richtig schreiben?

2664
Charles Yeung

Sie können die Funktion strpos() verwenden, um das Vorkommen einer Zeichenfolge in einer anderen zu ermitteln:

$a = 'How are you?';

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

Beachten Sie, dass die Verwendung von !== false absichtlich ist (weder != false noch === true wird funktionieren); strpos() gibt entweder den Offset zurück, an dem die Nadelkette im Heuhaufen beginnt, oder den booleschen Wert false, wenn die Nadel nicht gefunden wird. Da 0 ein gültiger Offset ist und 0 "falsey" ist, können wir keine einfacheren Konstrukte wie !strpos($a, 'are') verwenden.

6343
codaddict

Sie können reguläre Ausdrücke verwenden. Wie von anderen Benutzern erwähnt, ist dies für die Wortübereinstimmung besser als strpos. Für Zeichenfolgen wie z. B. fare, care, stare usw. wird ebenfalls true zurückgegeben Wortgrenzen.

Eine einfache Übereinstimmung für are könnte etwa so aussehen:

_$a = 'How are you?';

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

Auf der Performanceseite ist strpos ungefähr dreimal schneller und wenn ich eine Million Vergleiche gleichzeitig gemacht habe, hat es preg_match 1,5 Sekunden gedauert, um fertig zu werden und für strpos Es dauerte 0,5 Sekunden.

Bearbeiten: Um einen beliebigen Teil der Zeichenfolge zu durchsuchen, nicht nur Word für Word, 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';
}
_

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

Dies kann in einigen Fällen recht problematisch sein, da die $ -Suchzeichenfolge in keiner Weise bereinigt wird. Ich meine, in einigen Fällen wird die Prüfung möglicherweise nicht bestanden, als ob _$search_ eine Benutzereingabe ist, die sie hinzufügen können Zeichenfolge, die sich wie ein anderer regulärer Ausdruck verhält ...

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 (einschließlich 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.
}
_
557
Breezer

Hier ist ein kleines Hilfsprogramm, das in solchen Situationen nützlich ist

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

Während die meisten dieser Antworten Ihnen sagen, ob eine Teilzeichenfolge in Ihrer Zeichenfolge enthalten ist, ist dies normalerweise nicht der Fall, wenn Sie nach einem bestimmten Wort suchen. und kein Teilstring .

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

  • 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 weist nicht dieselben oben genannten Fehlalarme auf, sondern hat einige eigene Edge-Fälle. Wortgrenzen stimmen mit Nicht-Wort-Zeichen (\W) überein, bei denen es sich um alles handelt, was nicht a-z, A-Z, 0-9 oder _ ist. . Das bedeutet, dass Ziffern und Unterstriche als Word-Zeichen gezählt werden und solche Szenarien fehlschlagen:

  • Das "sind" in "Was denken Sie?"
  • Die "sind" in "lol du weißt nicht, die are4?"

Wenn Sie etwas genaueres wollen, müssen Sie mit der Syntaxanalyse in englischer Sprache beginnen, und das ist eine ziemlich große Menge an Würmern (und setzt die ordnungsgemäße Verwendung der Syntax voraus, die nicht immer gegeben ist).

131
FtDRbwLXw6

Um festzustellen, ob eine Zeichenfolge eine andere Zeichenfolge enthält, können Sie die Funktion PHP 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";
}

?>

ACHTUNG:

Befindet sich die gesuchte Nadel am Anfang des Heuhaufens, gibt sie die Position 0 zurück. Wenn Sie einen == -Vergleich durchführen, der nicht funktioniert, müssen Sie einen === durchführen.

Ein == -Zeichen ist ein Vergleich und prüft, ob die Variable/Ausdruck/Konstante links den gleichen Wert wie die Variable/Ausdruck/Konstante rechts hat.

Ein === -Zeichen ist ein Vergleich, um festzustellen, ob zwei Variablen/Ausdrücke/Konstanten gleich sind. AND haben den gleichen Typ - d. H. Beide sind Zeichenfolgen oder beide sind ganze Zahlen.

119
Jose Vega

Siehe 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.";
    }
?>
63
Haim Evgi

Die Verwendung von strstr() oder stristr() , wenn bei der Suche die Groß- und Kleinschreibung nicht berücksichtigt wird, ist eine weitere Option.

59
glutorange

Kommentare von SamGoody und Lego Stormtroopr.

Wenn Sie nach einem PHP - Algorithmus suchen, um die Suchergebnisse basierend auf der Nähe/Relevanz Ranking mehrerer Wörter zu ordnen, können Sie hier schnell und einfach Suchergebnisse mit PHP:

Probleme mit den anderen booleschen Suchmethoden wie strpos(), preg_match(), strstr() oder stristr()

  1. kann nicht nach mehreren Wörtern suchen
  2. ergebnisse werden nicht gewertet

PHP-Methode basierend auf Vector Space Model und tf-idf (Begriff Häufigkeit - umgekehrte Häufigkeit von Dokumenten):

Es hört sich schwierig an, ist aber überraschend einfach.

Wenn wir nach mehreren Wörtern in einer Zeichenfolge suchen möchten, besteht das Hauptproblem darin, wie wir jedem einzelnen ein Gewicht zuweisen.

Wenn wir die Begriffe in einem String danach gewichten könnten, wie repräsentativ sie für den gesamten String sind, könnten wir unsere Ergebnisse nach denjenigen ordnen, die am besten zu der 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;
}

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

CASE 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>';

RESULTS

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

CASE 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>';

RESULTS

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

Es gibt viele Verbesserungen, aber das Modell bietet eine Möglichkeit, gute Ergebnisse aus natürlichen Abfragen zu erhalten, für die es keine booleschen Operatoren wie strpos(), preg_match(), strstr() oder stristr() gibt.

NOTA BENE

Optionale Beseitigung der Redundanz vor der Suche nach Wörtern

  • 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. Stopword Elimination

  • 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 Entsprechungen

  • Das Verringern von numerischen Werten durch Verringern der Genauigkeit ist eine andere Möglichkeit, den Text zu normalisieren.

RESOURCES

44
RafaSashi

Verwenden Sie die case-insensitive Zuordnung mit stripos() :

if (stripos($string,$stringToSearch) !== false) {
    echo 'true';
}
42

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, vermeidet aber die Vergleichsprobleme.

40
Alan Piralla

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

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

Beachten Sie: Die Funktion strstr () unterscheidet zwischen Groß- und Kleinschreibung. Verwenden Sie für eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung die Funktion stristr () .

30
YashG99

Ich bin ein bisschen beeindruckt, dass keine der Antworten hier, die strpos, strstr und ähnliche Funktionen verwendet haben, bereits Multibyte String Functions erwähnt hat (08.05.2015).

Grundsätzlich gilt: Wenn Sie Probleme haben, Wörter mit sprachspezifischen Zeichen zu finden, z. B. Deutsch, Französisch, Portugiesisch, Spanisch usw. (z. B .: ä , é , ô , ç , º , ñ ), möchten Sie den Funktionen möglicherweise _mb__ voranstellen. Daher würde die akzeptierte Antwort stattdessen mb_strpos oder mb_stripos (für Übereinstimmungen ohne Berücksichtigung der Groß-/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 vorliegen, können Sie die Funktionen _mb__ verwenden.

Ein guter Artikel, um zu verstehen, warum Das absolute Minimum, das jeder Softwareentwickler unbedingt und unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!) von Joel Spolsky.

28
Armfoot
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
28
joan16v

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 Ermittelt die Position des ersten Auftretens einer Teilzeichenfolge, bei der die Groß- und Kleinschreibung beachtet wird.
  • stripos Ermittelt die Position des ersten Auftretens einer Teilzeichenfolge, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUE stellt sicher, dass myFunction immer einen Booleschen Wert zurückgibt und ein unerwartetes Verhalten behebt, wenn der Index der Teilzeichenfolge 0 ist.
  • $caseSensitive ? A : B wählt entweder strpos oder stripos , um die Arbeit auszuführen, 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)
23
John Slegers

Die folgende Funktion funktioniert auch und ist von keiner anderen Funktion abhängig. Es wird nur die native PHP Zeichenfolgenmanipulation 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 
22
Jason OOO

Sie können die Funktion strstr verwenden:

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

if ($flag){

    echo "true";
}

Ohne eingebaute 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 ";
}
21
Arshid KV

Ich hatte einige Probleme damit und entschied mich schließlich für eine eigene Lösung. Ohne Verwendung von regulärer Ausdruck engine:

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";

In den obigen Beispielen enthalten sowohl $a als auch $b$c, aber Sie möchten möglicherweise, dass Ihre Funktion Ihnen mitteilt, dass nur $a$c enthält.

20
Decebal

Eine andere Möglichkeit, das Vorkommen eines Wortes in einer Zeichenfolge mit strstr () und stristr () zu ermitteln, ist wie folgt:

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>
17
Sadikhasan

Um ein "Wort" zu finden, anstatt eine Reihe von Buchstaben zu verwenden, die tatsächlich Teil eines anderen Wortes sein könnten, ist Folgendes eine gute Lösung.

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

if (in_array('are', $array) ) {
    echo 'Found the Word';
}
14
DJC

Dies kann auf drei verschiedene Arten geschehen:

 $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
 }
14
Shashank Singh

Die Kurzhandversion

$result = false!==strpos($a, 'are');
14

Vielleicht könnten Sie so etwas verwenden:

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

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

Sie sollten das Format "Groß-/Kleinschreibung nicht beachten" verwenden. Wenn der eingegebene Wert also small oder caps lautet, spielt dies keine Rolle.

<?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 Groß-/Kleinschreibung zu berücksichtigen.

PHPCode Sample mit Ausgabe

13
Pratik

Viele Antworten, die substr_count verwenden, prüfen, ob das Ergebnis _>0_ ist. Aber da die if -Anweisung Null als dasselbe wie false betrachtet, können Sie diese Prüfung vermeiden und direkt schreiben:

_if (substr_count($a, 'are')) {
_

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

_if (!substr_count($a, 'are')) {
_
13
T30

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

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

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 beispielsweise beim Versenden von E-Mails Spam zu vermeiden.

11
Julien

Die Strpos-Funktion funktioniert einwandfrei, aber wenn Sie case-insensitive ausführen möchten, um nach einem Wort in einem Absatz zu suchen, können Sie die stripos -Funktion von PHP verwenden.

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 einer Teilzeichenfolge, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.

Wenn das Wort in der Zeichenfolge nicht vorhanden ist, wird false zurückgegeben, andernfalls wird die Position des Wortes zurückgegeben.

10
Akshay Khale

Sie müssen identische/nicht identische Operatoren verwenden, da strpos als Indexwert 0 zurückgeben kann. Wenn Sie ternäre Operatoren mögen, sollten Sie Folgendes in Betracht ziehen (ich gebe es zu, scheint ein wenig rückwärts):

echo FALSE === strpos($a,'are') ? 'false': 'true';
9
Shapeshifter

Ü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 ist nicht für jede Zeichenfolge das Wort gemeint.

Eine praktische Definition von Word ist das PCRE-Modul für reguläre Ausdrücke, bei dem Wörter Teilzeichenfolgen sind, die nur aus Word-Zeichen bestehen und durch Nicht-Word-Zeichen getrennt sind.

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

8
mvw

Eine Zeichenfolge kann mit der folgenden Funktion überprüft werden:

function either_String_existor_not($str, $character) {
    if (strpos($str, $character) !== false) {
        return true;
    }
    return false;
}
7
M Razwan

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 Funktion strpos() verwenden.

6
devpro

Verwenden:

$text = 'This is a test';
echo substr_count($text, 'is'); // 2

// So if you want to check if is exists in the text just put
// in a condition like this:
if (substr_count($text, 'is') > 0) {
    echo "is exists";
}
5
Kamaro Lambert

Eine einfachere Option:

return ( ! empty($a) && strpos($a, 'are'))? true : false;
4
ShirleyCC

Ich denke, dass eine gute Idee ist, mb_stpos zu verwenden:

$haystack = 'How are you?';
$needle = 'are';

if (mb_strpos($haystack, $needle) !== false) {

    echo 'true';
}

Weil diese Lösung Groß- und Kleinschreibung beachten und sicher für alle Unicode-Zeichen ist.


Sie können es aber auch so machen ( sauch Antwort war noch nicht ):

if (count(explode($needle, $haystack)) > 1) {

    echo 'true';
}

Diese Lösung ist auch Groß- und Kleinschreibung beachten und sicher für Unicode-Zeichen.

Zusätzlich können Sie verwenden Sie nicht die Negation im Ausdruck, was die Lesbarkeit des Codes erhöht.


Hier ist eine andere Lösung mit Funktion:

function isContainsStr($haystack, $needle) {

    return count(explode($needle, $haystack)) > 1;
}

if (isContainsStr($haystack, $needle)) {

    echo 'true';
}
4
simhumileco

Verwenden:

$a = 'How are you?';
if (mb_strpos($a, 'are')) {
    echo 'true';
}

Es führt eine multibyte-sichere strpos () -Operation aus.

3
Mindexperiment

Sie können auch die integrierten Funktionen strchr() und strrchr() und die Erweiterungen für Multibyte-Strings mb_strchr() und mb_strrchr() verwenden. Diese Funktionen geben Teile von Strings und FALSE zurück, wenn nichts gefunden wird.

  • strchr() - Finde das erste Vorkommen einer Zeichenkette (ist ein Alias ​​von strstr() ).
  • strrchr() - Finde das letzte Vorkommen eines Zeichens in einer Zeichenkette.
3
Aleksey Bykov