Miten tarkistan, sisältääkö merkkijono tietyn sanan?

Harkitse:

$a = 'How are you?';

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

Oletetaan, että minulla on yllä oleva koodi, mikä on oikea tapa kirjoittaa lauseke if ($a sisältää 'are')?

Ratkaisu

Voit käyttää funktiota strpos(), jota käytetään yhden merkkijonon löytämiseen toisen merkkijonon sisältä:

$a = 'How are you?';

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

Huomaa, että !== false on tarkoituksellinen (!= false tai === true eivät palauta haluttua tulosta); strpos() palauttaa joko siirtymän, josta neulan merkkijono alkaa heinäsuovassa, tai boolean false, jos neulaa ei löydy. Koska 0 on kelvollinen offset ja 0 on "falsey", emme voi'käyttää yksinkertaisempia konstruktioita kuten !strpos($a, 'are').

Kommentit (29)

Voisit käyttää säännöllisiä lausekkeita, se on parempi sanojen sovittamiseen kuin strpos, kuten muut käyttäjät ovat maininneet, ja se palauttaa myös tosiasioita merkkijonoille, kuten fare, care, stare jne. Tämä voidaan yksinkertaisesti välttää säännöllisissä lausekkeissa käyttämällä sanarajoja.

Yksinkertainen täsmääminen sanalle are voisi näyttää tältä:

$a = 'How are you?';

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

Suorituskyvyn kannalta strpos on noin kolme kertaa nopeampi, ja pitää muistaa, että kun tein miljoona vertailua kerralla, preg_match tarvitsi 1,5 sekuntia ja strpos 0,5 sekuntia.

Muokkaa: Jos haluat etsiä mitä tahansa osaa merkkijonosta, etkä vain sana sanalta, suosittelen käyttämään säännöllistä lauseketta kuten

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

Säännöllisen lausekkeen lopussa oleva i muuttaa säännöllisen lausekkeen niin, että se ei huomioi isoja ja pieniä kirjaimia, jos et halua sitä, voit jättää sen pois.

Tämä voi olla melko ongelmallista joissakin tapauksissa, koska $search-merkkijonoa ei ole puhdistettu millään tavalla, tarkoitan, että se ei ehkä läpäise tarkistusta joissakin tapauksissa, koska jos $search on käyttäjän syöttö, hän voi lisätä merkkijonon, joka saattaa käyttäytyä kuin jokin muu säännöllinen lauseke...

Tässä'on myös hyvä työkalu, jolla voi testata ja nähdä selityksiä erilaisista säännöllisistä lausekkeista Regex101.

Jos haluat yhdistää molemmat toiminnot yhdeksi monikäyttöiseksi funktioksi (jossa on myös valittavissa isojen ja pienten kirjainten herkkyys), voit käyttää jotakin tämän kaltaista:

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.
}
Kommentit (13)

Katso 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.";
    }
?>
Kommentit (0)