Come posso verificare se una stringa contiene una parola specifica?


2661

Prendere in considerazione:

$a = 'How are you?';

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

Supponiamo di avere il codice sopra, qual è il modo corretto di scrivere la dichiarazione if ($a contains 'are')?

Risposte:


6894

È possibile utilizzare la strpos()funzione utilizzata per trovare l'occorrenza di una stringa all'interno di un'altra:

$a = 'How are you?';

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

Si noti che l'uso di !== falseè deliberato (né != false=== truerestituirà il risultato desiderato); strpos()restituisce l'offset in corrispondenza del quale inizia la stringa dell'ago nella stringa del pagliaio o il valore booleano falsese l'ago non viene trovato. Poiché 0 è un offset valido e 0 è "falsey", non possiamo usare costrutti più semplici come !strpos($a, 'are').


261
Molto tardi alla festa, ma fai attenzione. Ciò restituirà anche vero per la stringa "Ti interessa?"
DTest,

167
@DTest - beh sì, ovviamente restituirà true perché la stringa contiene 'are'. Se stai cercando specificamente la parola ARE, allora dovresti fare più controlli come, ad esempio, controllare se c'è un carattere o uno spazio prima della A e dopo l'E
jsherk

40
Molto buoni commenti sopra! Non uso mai! = O ==, dopo tutto! == e === è l'opzione migliore (secondo me) tutti gli aspetti considerati (velocità, precisione ecc.).
Melsi,

10
@jsherk Perché non regex, quindi? Qualcosa come "sono".
Giulio Muscarello,

22
Tendo a evitare questo problema usando sempre strpos($a, 'are') > -1per verificare la verità. Dal punto di vista del debug, trovo che il mio cervello spreca meno cicli di clock per determinare se la linea è scritta correttamente quando non devo contare segni di uguali contigui.
equazcion

608

Potresti usare espressioni regolari, è meglio per la corrispondenza delle parole rispetto a strposquanto menzionato da altri utenti, inoltre tornerà vero per stringhe come tariffa, cura, sguardo, ecc. Questo può essere semplicemente evitato nell'espressione regolare usando i confini delle parole.

Una semplice corrispondenza per are potrebbe essere simile a questa:

$a = 'How are you?';

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

Per quanto riguarda le prestazioni, strposè circa tre volte più veloce e ho in mente, quando ho fatto un milione di confronti alla volta, ci sono voluti preg_match1,5 secondi per terminare e per strpos0,5 secondi.

Modifica: per cercare qualsiasi parte della stringa, non solo parola per parola, consiglierei di usare un'espressione regolare come

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

La ifine dell'espressione regolare cambia l'espressione regolare in distinzione tra maiuscole e minuscole, se non lo desideri, puoi lasciarla fuori.

Ora, questo può essere abbastanza problematico in alcuni casi poiché la stringa $ search non è disinfettata in alcun modo, voglio dire, in alcuni casi potrebbe non passare il controllo come se $searchun input dell'utente potesse aggiungere una stringa che potrebbe comportarsi come qualche diversa espressione regolare ...

Inoltre, ecco un ottimo strumento per testare e vedere le spiegazioni di varie espressioni regolari Regex101

Per combinare entrambi i set di funzionalità in un'unica funzione multiuso (incluso con la distinzione maiuscole / minuscole selezionabile), è possibile utilizzare qualcosa del genere:

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

9
@ Alexander.Plutov in secondo luogo mi stai dando un -1 e non la domanda? cmon ci vogliono 2 secondi per google la risposta google.com/…
Breezer

64
+1 È un modo orribile per cercare una stringa semplice, ma molti visitatori di SO stanno cercando un modo per cercare una delle loro sottostringhe ed è utile che il suggerimento sia stato sollevato. Anche l'OP potrebbe essersi semplificato troppo - fagli sapere delle sue alternative.
SamGoody

72
Tecnicamente, la domanda chiede come trovare parole non una sottostringa. Questo in realtà mi ha aiutato come posso usare questo con limiti di parole regex. Le alternative sono sempre utili.

15
+1 per la risposta e -1 al commento @ plutov.by perché, strpos è solo un singolo controllo nel frattempo regexp puoi controllare più parole contemporaneamente es: preg_match (/ are | you | not /)
albanx

4
Le espressioni regolari dovrebbero essere l'ultimo metodo di ricorso. Il loro uso in compiti banali dovrebbe essere scoraggiato. Insisto su questo dal culmine di molti anni di ricerca di codici errati.
yentsun,

257

Ecco una piccola funzione di utilità che è utile in situazioni come questa

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

74
@RobinvanBaalen In realtà, può migliorare la leggibilità del codice. Inoltre, i downvotes dovrebbero essere per (molto) cattive risposte, non per quelle "neutrali".
Xaqq,

37
Le funzioni di @RobinvanBaalen sono quasi per definizione leggibili (per comunicare l'idea di ciò che stai facendo). Confronta quale è più leggibile: if ($email->contains("@") && $email->endsWith(".com)) { ...oppureif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Brandin

3
@RobinvanBaalen nelle regole finali è pensato per essere infranto. Altrimenti le persone non avrebbero escogitato nuovi modi inventivi di fare le cose :). Inoltre, devo ammettere che ho problemi ad avvolgere la mente su cose come su martinfowler.com. Indovina la cosa giusta da fare è provare le cose da soli e scoprire quali approcci sono i più convenienti.
James P.

5
Un'altra opinione: avere una funzione di utilità che puoi facilmente avvolgere può aiutare il debug. Inoltre, lancia il grido di buoni ottimizzatori che eliminano tale sovraccarico nei servizi di produzione. Quindi tutte le opinioni hanno punti validi. ;)
Tino,

18
Naturalmente questo è utile. Dovresti incoraggiarlo. Cosa succede se in PHP 100 esiste un modo nuovo e più veloce per trovare le posizioni delle stringhe? Vuoi cambiare tutti i luoghi in cui chiami strpos? O vuoi cambiare solo i contenuti all'interno della funzione ??
Cosmin,

143

Mentre la maggior parte di queste risposte ti dirà se appare una sottostringa nella tua stringa, di solito non è quello che vuoi se stai cercando una parola particolare , e non una sottostringa .

Qual è la differenza? Le sottostringhe possono apparire in altre parole:

  • Le "sono" all'inizio di "area"
  • Le "sono" alla fine di "lepre"
  • Le "sono" nel mezzo di "tariffe"

Un modo per mitigare questo sarebbe usare un'espressione regolare unita a limiti di parole ( \b):

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

Questo metodo non ha gli stessi falsi positivi sopra menzionati, ma ha alcuni casi limite propri. Limiti delle parole corrispondono a caratteri non-parola ( \W), che stanno per essere tutto ciò che non è a-z, A-Z, 0-9, o _. Ciò significa che le cifre e i trattini bassi verranno conteggiati come caratteri di parole e scenari come questo falliranno:

  • Le "sono" in "Cosa stai pensando?"
  • Il "sono" in "non lo sai che quelli sono 4?"

Se vuoi qualcosa di più preciso di questo, dovrai iniziare a eseguire l'analisi della sintassi in lingua inglese, e questa è una lattina abbastanza grande di worm (e presuppone comunque un uso corretto della sintassi, che non è sempre scontato).


24
questa dovrebbe essere la risposta canonica. Poiché stiamo cercando parole e non sottostringhe , regex è appropriato. Aggiungerò anche che \bcorrisponde a due cose che \Wnon lo fanno, il che lo rende ^$
perfetto

questa dovrebbe essere la risposta corretta .. il resto delle risposte troverà "sono" in una stringa come "ti interessa" .. Come menzionato da @Dtest
Robert Sinclair il

@RobertSinclair È così male? Se mi chiedessi se la stringa "ti interessa" contiene la parola "sono" direi "sì". La parola "are" è chiaramente una sottostringa di quella stringa. Questa è una domanda separata da "" "È" sono "una delle parole nella stringa" ti interessa "" "".
Paul,

@Paulpro Anche se OP non ha specificato $ a è una frase, sono abbastanza sicuro che fosse implicito. Quindi la sua domanda era come rilevare la Parola all'interno della Frase. Non se una Parola contiene una Parola al suo interno, che presumo sarebbe irrilevante il più delle volte.
Robert Sinclair,

@Jimbo funziona, ti manca solo il `\` 3v4l.org/ZRpYi
MetalWeirdo

125

Per determinare se una stringa contiene un'altra stringa è possibile utilizzare la funzione PHP 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";
}

?>

ATTENZIONE:

Se l'ago che stai cercando è all'inizio del pagliaio, tornerà in posizione 0, se fai un ==confronto che non funzionerà, dovrai fare un===

Un ==segno è un confronto e verifica se la variabile / espressione / costante a sinistra ha lo stesso valore della variabile / espressione / costante a destra.

Un ===segno è un confronto per vedere se due variabili / espressioni / costanti sono uguali ANDhanno lo stesso tipo - cioè entrambi sono stringhe o entrambi sono numeri interi.


67

Guardastrpos() :

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

62

Utilizzare strstr()o stristr()se la ricerca non dovrebbe fare distinzione tra maiuscole e minuscole sarebbe un'altra opzione.


9
Una nota sulla pagina php.net/manual/en/function.strstr.php : Nota: se vuoi solo determinare se un particolare ago si trova all'interno del pagliaio, usa invece la funzione strpos () più veloce e meno intensiva della memoria.
Jo Smo,

@tastro Ci sono benchmark affidabili su questo?
Wayne Whitty,

Questo potrebbe essere più lento, ma IMHO strstr($a, 'are')è molto più elegante dei brutti strpos($a, 'are') !== false. PHP ha davvero bisogno di una str_contains()funzione.
Paul Spiegel,

Mi viene in mente che questa non è la risposta accettata
kurdtpage il

45

Utilizza la corrispondenza senza distinzione tra maiuscole e minuscole utilizzando stripos():

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

45

Scrutiamo i commenti di SamGoody e Lego Stormtroopr.

Se stai cercando un algoritmo PHP per classificare i risultati della ricerca in base alla prossimità / rilevanza di più parole, ecco un modo rapido e semplice di generare risultati di ricerca solo con PHP:

Problemi con gli altri metodi di ricerca booleana, come strpos(), preg_match(), strstr()ostristr()

  1. impossibile cercare più parole
  2. i risultati non sono classificati

Metodo PHP basato su Vector Space Model e tf-idf (termine frequenza-frequenza inversa del documento):

Sembra difficile ma è sorprendentemente facile.

Se vogliamo cercare più parole in una stringa, il problema principale è come assegniamo un peso a ciascuna di esse?

Se potessimo ponderare i termini in una stringa in base a quanto siano rappresentativi della stringa nel suo insieme, potremmo ordinare i nostri risultati in base a quelli che meglio corrispondono alla query.

Questa è l'idea del modello dello spazio vettoriale, non lontano da come funziona la ricerca full-text SQL:

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

CASO 1

$query = 'are';

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

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

RISULTATO

Array
(
    [1] => 0.52832083357372
)

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

RISULTATI

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

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

RISULTATI

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

Ci sono un sacco di miglioramenti da apportare, ma il modello fornisce un modo di ottenere buoni risultati da query naturali, che non hanno operatori booleani quali strpos(), preg_match(), strstr()o stristr().

NOTA BENE

Eliminazione facoltativa della ridondanza prima di cercare le parole

  • riducendo così le dimensioni dell'indice e riducendo i requisiti di archiviazione

  • meno I / O su disco

  • indicizzazione più rapida e una ricerca di conseguenza più veloce.

1. Normalizzazione

  • Converti tutto il testo in minuscolo

2. Eliminazione di Stopword

  • Elimina dal testo le parole che non hanno alcun significato reale (come "e", "o", "il", "per", ecc.)

3. Sostituzione del dizionario

  • Sostituisci le parole con altre che hanno un significato identico o simile. (ad esempio: sostituisci i casi di "fame" e "fame" con "fame")

  • Ulteriori misure algoritmiche (palla di neve) possono essere eseguite per ridurre ulteriormente le parole al loro significato essenziale.

  • La sostituzione dei nomi dei colori con i loro equivalenti esadecimali

  • La riduzione dei valori numerici riducendo la precisione sono altri modi per normalizzare il testo.

RISORSE


40

Se vuoi evitare il problema "falso" e "vero", puoi usare substr_count:

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

È un po 'più lento di Strpos ma evita i problemi di confronto.


Torna falseper "sei sicuro?" poiché la posizione per strposè0
Hafenkranich l'

30

Un'altra opzione è quella di utilizzare la funzione strstr () . Qualcosa di simile a:

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

Nota: la funzione strstr () fa distinzione tra maiuscole e minuscole. Per una ricerca senza distinzione tra maiuscole e minuscole, utilizzare la funzione stristr () .


1
strstr () restituisce FALSE se l'ago non è stato trovato. Quindi non è necessario un sforzo.
Ayesh K,

29
if (preg_match('/(are)/', $a)) {
   echo 'true';
}

3
Ricevo il seguente avviso:WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Pathros,

27

Sono un po 'impressionato dal fatto che nessuna delle risposte qui che ha usato strpos, strstre analoghe menzionato Funzioni Multibyte stringa ancora (2015/05/08).

Fondamentalmente, se hai problemi a trovare parole con caratteri specifici di alcune lingue , come tedesco, francese, portoghese, spagnolo, ecc. (Es. Ä , é , ô , ç , º , ñ ), potresti voler precedere le funzioni con mb_. Pertanto, la risposta accettata utilizza invece mb_strposo mb_stripos(per la corrispondenza senza maiuscole / minuscole):

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

Se non puoi garantire che tutti i tuoi dati siano al 100% in UTF-8 , potresti voler utilizzare le mb_funzioni.

Un buon articolo per capire il motivo per cui è Developer minima assoluta Ogni software assolutamente, positivamente deve sapere su Unicode e set di caratteri (scuse!) Da Joel Spolsky .


25

In PHP, il modo migliore per verificare se una stringa contiene una determinata sottostringa è utilizzare una semplice funzione di supporto come questa:

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

Spiegazione:

  • strpos trova la posizione della prima occorrenza di una sottostringa sensibile al maiuscolo / minuscolo in una stringa.
  • stripos trova la posizione della prima occorrenza di una sottostringa senza distinzione tra maiuscole e minuscole in una stringa.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUEassicura che myFunctionrestituisca sempre un valore booleano e risolve comportamenti imprevisti quando l'indice della sottostringa è 0.
  • $caseSensitive ? A : Bseleziona strposo striposper eseguire il lavoro, a seconda del valore di $caseSensitive.

Produzione:

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)

22

Anche la seguente funzione funziona e non dipende da altre funzioni; utilizza solo la manipolazione nativa di stringhe PHP. Personalmente, non lo consiglio, ma puoi vedere come funziona:

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

Test:

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 

13
Potresti dirmi perché nel mondo dovresti usare una funzione come questa, quando strpos è una soluzione perfettamente praticabile? ...
sg3s

3
@Sg3s: hai perfettamente ragione, tuttavia, anche su strpos basato su qualcosa del genere, non l'ho pubblicato per rappresentante solo per condividere un po 'di conoscenza
Jason OOO,

L'ultimo var_dump è falso
Sunny,

1
@Sunny: era un refuso: var_dump (is_str_contain ("mystringss", "stringhe")); // true
Jason OOO,

22

Puoi usare la strstrfunzione:

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

if ($flag){

    echo "true";
}

Senza utilizzare una funzione integrata:

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

2
Si blocca se si cerca la prima parola.
T30

20

Ho avuto qualche problema con questo, e alla fine ho scelto di creare la mia soluzione. Senza usare il motore delle espressioni regolari :

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

È possibile notare che le soluzioni precedenti non sono una risposta per la parola utilizzata come prefisso per un'altra. Per usare il tuo esempio:

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

Con gli esempi sopra, entrambi $ae $bcontiene $c, ma potresti volere che la tua funzione ti dica che $acontiene solo $c.


1
probabilmente intendevi: $found = falseall'inizio
slownage

1
la tua funzione potrebbe non funzionare se la parola è collegata con virgola, punto interrogativo o punto. ad es. "ciò che vedi è ciò che ottieni". e vuoi determinare se "get" è nella frase. Notare la fine completa accanto a "get". In questo caso, la funzione restituisce false. si consiglia di utilizzare espressioni regolari o substr (penso che usi comunque espressioni regolari) per cercare / sostituire le stringhe.
Portatore di luce

@lightbringer non potresti sbagliare di più con la tua raccomandazione, cosa significa per te "è consigliata"? non esiste una persona suprema che raccomanda o approva. Riguarda l'uso del motore di espressione regolare in php che è un buco nero nella lingua stessa, potresti voler provare a mettere una corrispondenza regex in un ciclo e confrontare i risultati.
Decebalo,

Questa risposta è scarsamente dimostrata e fallisce con molti scenari estesi. Non vedo alcun vantaggio nell'intrattenere questa tecnica. Ecco la raffinata funzione personalizzata e chiamata ripetuta: 3v4l.org/E9dfD Non ho interesse a modificare questo wiki perché trovo che sia una perdita di tempo per i ricercatori.
mickmackusa,

18

Un'altra opzione per trovare la ricorrenza di una parola da una stringa usando strstr () e stristr () è simile alla seguente:

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

Questo è al contrario. Il iin stristracronimo di insensibile.
Adam Merrifield,

18

Molte risposte che usano i substr_countcontrolli se il risultato è >0. Ma poiché l' ifistruzione considera zero uguale a falso , puoi evitare questo controllo e scrivere direttamente:

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

Per verificare se non presente, aggiungere l' !operatore:

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

Bene ... parzialmente vero, in php 0 == false è vero, ma 0 === false è falso
Andrejs Gubars

17

Può essere fatto in tre modi diversi:

 $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
 }

buono, ma preg_match è rischioso poiché può restituire false o 0. Dovresti provare per === 1 in # 3
Shapeshifter,

14

La versione abbreviata

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

5
Sebbene questo frammento di codice possa risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che in futuro stai rispondendo alla domanda dei lettori e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Bono,

14

Al fine di trovare una "parola", piuttosto che la presenza di una serie di lettere che potrebbero effettivamente far parte di un'altra parola, la seguente sarebbe una buona soluzione.

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

if (in_array('are', $array) ) {
    echo 'Found the word';
}

5
fallirà se $stringèAre are, are?
Sunny

13

Dovresti usare il formato maiuscole e minuscole, quindi se il valore inserito è smallo capsnon ha importanza.

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

Qui lo stripos trova l'ago nel pagliaio senza considerare il caso (piccolo / maiuscolo).

PHPCode Esempio con output


13

Forse potresti usare qualcosa del genere:

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

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

12

Non utilizzare preg_match()se si desidera solo verificare se una stringa è contenuta in un'altra stringa. Usa strpos()o strstr()invece come saranno più veloci. ( http://in2.php.net/preg_match )

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

12

Se vuoi verificare se la stringa contiene diverse parole specifiche, puoi fare:

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

Ciò è utile per evitare spam, ad esempio quando si inviano e-mail.


10

La funzione strpos funziona benissimo, ma se si desidera eseguire il case-insensitivecontrollo di una parola in un paragrafo, è possibile utilizzare la striposfunzione di PHP.

Per esempio,

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

Trova la posizione della prima occorrenza di una sottostringa senza distinzione tra maiuscole e minuscole in una stringa.

Se la parola non esiste nella stringa, restituirà false altrimenti restituirà la posizione della parola.


9

È necessario utilizzare operatori identici / non identici perché strpos può restituire 0 come valore di indice. Se ti piacciono gli operatori ternari, considera l'utilizzo di quanto segue (sembra un po 'arretrato, lo ammetto):

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

8

Verifica se la stringa contiene parole specifiche?

Questo significa che la stringa deve essere risolta in parole (vedi nota sotto).

Un modo per fare questo e per specificare i separatori sta usando 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');

?>

Una corsa dà

$ 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'

Nota: qui non intendiamo parola per ogni sequenza di simboli.

Una definizione pratica di parola è nel senso che il motore di espressione regolare PCRE, in cui le parole sono sottostringhe costituite solo da caratteri di parole, essendo separate da caratteri non di parole.

Un carattere "parola" è qualsiasi lettera o cifra o il carattere di sottolineatura, ovvero qualsiasi carattere che può far parte di una "parola" Perl. La definizione di lettere e cifre è controllata dalle tabelle dei caratteri di PCRE e può variare se si verifica una corrispondenza specifica della locale (..)


7

Un'altra soluzione per una stringa specifica:

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

Puoi anche usare la strpos()funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.