Hvordan sjekker jeg om en streng inneholder et bestemt ord?

Tenk over det:

$a = 'How are you?';

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

Anta at jeg har koden ovenfor, hva er den riktige måten å skrive setningen hvis ($a inneholder 'are')?

Løsning

Du kan bruke funksjonen strpos() som brukes til å finne forekomsten av en streng inne i en annen:

$a = 'How are you?';

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

Merk at bruken av !== false er bevisst (verken != false eller === true vil returnere det ønskede resultatet); strpos() returnerer enten forskyvningen der nålestrengen begynner i høystakken, eller den boolske false hvis nålen ikke finnes. Siden 0 er en gyldig forskyvning og 0 er "falsk", kan vi ikke bruke enklere konstruksjoner som !strpos($a, 'are').

Kommentarer (29)

Du kan bruke regulære uttrykk, det er bedre for ordmatching sammenlignet med strpos som nevnt av andre brukere, det vil også returnere sant for strenger som fare, omsorg, stirre osv. Dette kan enkelt unngås i regulære uttrykk ved å bruke ordgrenser.

Et enkelt treff for are kan se omtrent slik ut:

$a = 'How are you?';

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

På ytelsessiden er strpos omtrent tre ganger raskere, og husk at da jeg gjorde en million sammenligninger samtidig, tok det preg_match 1,5 sekunder å fullføre, og for strpos tok det 0,5 sekunder.

Rediger: For å søke på en hvilken som helst del av strengen, ikke bare ord for ord, vil jeg anbefale å bruke et regulært uttrykk som

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

i på slutten av det regulære uttrykket endrer det regulære uttrykket til å være ufølsomt for store og små bokstaver, hvis du ikke vil ha det, kan du utelate det.

Nå kan dette være ganske problematisk i noen tilfeller ettersom $search-strengen ikke er renset på noen måte, jeg mener, det kan ikke passere sjekken i noen tilfeller som om $search er en brukerinngang, de kan legge til en streng som kan oppføre seg som et annet regulært uttrykk ...

Her er også et flott verktøy for å teste og se forklaringer på forskjellige regulære uttrykk Regex101.

For å kombinere begge settene med funksjonalitet i en enkelt flerbruksfunksjon (inkludert med valgbar følsomhet for store og små bokstaver), kan du bruke noe som dette:

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

Se på 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.";
    }
?>
Kommentarer (0)