Considerate:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Supponiamo di avere il codice qui sopra, qual è il modo corretto di scrivere l'istruzione if ($a contiene 'are')
?
Puoi usare la funzione strpos()
che è usata per trovare l'occorrenza di una stringa dentro un'altra:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Si noti che l'uso di !== false
è intenzionale (né != false
né === true
restituiranno il risultato desiderato); strpos()
restituisce o l'offset al quale la stringa ago inizia nella stringa pagliaio, o il booleano false
se l'ago non viene trovato. Poiché 0 è un offset valido e 0 è "falso", non possiamo usare costrutti più semplici come !strpos($a, 'are')
.
Potresti usare le espressioni regolari, è meglio per la corrispondenza delle parole rispetto a strpos
come menzionato da altri utenti, restituirà anche vero per stringhe come fare, care, stare, ecc. Questo può essere semplicemente evitato nelle espressioni regolari usando i confini delle parole.
Una semplice corrispondenza per are potrebbe apparire come questa:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
Dal punto di vista delle prestazioni, strpos
è circa tre volte più veloce e tenete presente che quando ho fatto un milione di confronti in una volta, ci sono voluti preg_match
1,5 secondi per finire e per strpos
ci sono voluti 0,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 i
alla fine dell'espressione regolare cambia l'espressione regolare per essere case-insensitive, se non vuoi questo, puoi lasciarla fuori.
Ora, questo può essere abbastanza problematico in alcuni casi poiché la stringa $search non è sanificata in alcun modo, voglio dire, potrebbe non passare il controllo in alcuni casi poiché se $search
è un input dell'utente possono aggiungere qualche stringa che potrebbe comportarsi come una diversa espressione regolare...
Inoltre, qui c'è un ottimo strumento per testare e vedere spiegazioni di varie espressioni regolari Regex101
Per combinare entrambi gli insiemi di funzionalità in un'unica funzione multiuso (anche con sensibilità alle maiuscole e alle minuscole selezionabile), si potrebbe usare qualcosa come questo:
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.";
}
?>