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