Apsveriet:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Pieņemsim, ka man ir iepriekš minētais kods, kā pareizi rakstīt paziņojumu if ($a satur 'are')
?
Varat izmantot funkciju strpos()
, kas tiek izmantota, lai atrastu vienas virknes parādīšanos citā virknē:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Ņemiet vērā, ka !== false
ir izmantots apzināti (ne != false
, ne === true
neatgriezīs vēlamo rezultātu); strpos()
atgriež vai nu nobīdi, kurā sākas adatas virkne siena kaudzes virknē, vai arī bolu false
, ja adata nav atrasta. Tā kā 0 ir derīgs nobīde un 0 ir "falsey", mēs nevaram izmantot vienkāršākas konstrukcijas, piemēram, !strpos($a, 'are')
.
Jūs varētu izmantot regulārās izteiksmes, tas ir labāk piemērots vārdu saskaņošanai, salīdzinot ar strpos
, kā minēja citi lietotāji, tas arī atgriezīs true tādām virknēm kā fare, care, stare utt. No tā var vienkārši izvairīties, izmantojot regulārās izteiksmes, izmantojot vārdu robežas.
Vienkārša sakritība ar are varētu izskatīties šādi:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
Runājot par veiktspēju, strpos
ir apmēram trīs reizes ātrāks, un paturiet prātā, ka, veicot vienu miljonu salīdzinājumu uzreiz, preg_match
prasīja 1,5 sekundes, bet strpos
- 0,5 sekundes.
Rediģēt: Lai meklētu jebkuru virknes daļu, ne tikai vārdu pa vārdam, es ieteiktu izmantot regulāru izteiksmi, piemēram, šādu.
$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
echo 'true';
}
Regulārās izteiksmes beigās esošais i
maina regulāro izteiksmi uz lielo un mazo burtu nenošķiršanu, ja to nevēlaties, varat to izlaist.
Dažos gadījumos tas var būt diezgan problemātiski, jo virkne $search nav nekādā veidā attīrīta, proti, dažos gadījumos tā var neizturēt pārbaudi, jo, ja $search
ir lietotāja ievades dati, viņi var pievienot kādu virkni, kas var uzvesties kā kāda cita regulārā izteiksme...
Šeit ir arī lielisks rīks, ar kura palīdzību var pārbaudīt un apskatīt dažādu regulāro izteicienu skaidrojumus Regex101.
Lai apvienotu abas funkcionalitātes vienā daudzfunkcionālā funkcijā (arī ar atlasāmu lielo un mazo burtu jūtīgumu), jūs varētu izmantot kaut ko līdzīgu šim:
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.";
}
?>