Σκεφτείτε:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Ας υποθέσουμε ότι έχω τον παραπάνω κώδικα, ποιος είναι ο σωστός τρόπος να γράψω τη δήλωση if ($a contains 'are')
;
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση strpos()
η οποία χρησιμοποιείται για να βρείτε την εμφάνιση ενός αλφαριθμητικού μέσα σε ένα άλλο:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Σημειώστε ότι η χρήση του !== false
είναι σκόπιμη (ούτε το != false
ούτε το === true
θα επιστρέψει το επιθυμητό αποτέλεσμα)- η strpos()
επιστρέφει είτε τη μετατόπιση στην οποία αρχίζει η συμβολοσειρά της βελόνας μέσα στη συμβολοσειρά του άχυρου, είτε το boolean false
αν η βελόνα δεν έχει βρεθεί. Δεδομένου ότι το 0 είναι ένα έγκυρο offset και το 0 είναι "falsey", δεν μπορούμε'να χρησιμοποιήσουμε απλούστερες δομές όπως !strpos($a, 'are')
.
Θα μπορούσατε να χρησιμοποιήσετε κανονικές εκφράσεις, είναι καλύτερο για το ταίριασμα λέξεων σε σύγκριση με το strpos
, όπως αναφέρθηκε από άλλους χρήστες, θα επιστρέψει επίσης αληθινές τιμές για συμβολοσειρές όπως fare, care, stare, κ.λπ. Αυτό μπορεί απλά να αποφευχθεί στις κανονικές εκφράσεις με τη χρήση ορίων λέξεων.
Ένα απλό ταίριασμα για το are θα μπορούσε να μοιάζει κάπως έτσι:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
Από την πλευρά της απόδοσης, το strpos
είναι περίπου τρεις φορές πιο γρήγορο και να έχετε κατά νου, όταν έκανα ένα εκατομμύριο συγκρίσεις ταυτόχρονα, το preg_match
χρειάστηκε 1,5 δευτερόλεπτο για να τελειώσει και για το strpos
χρειάστηκε 0,5 δευτερόλεπτο.
Επεξεργασία: Για να αναζητήσετε οποιοδήποτε μέρος της συμβολοσειράς, όχι μόνο λέξη προς λέξη, θα συνιστούσα να χρησιμοποιήσετε μια κανονική έκφραση όπως
$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
echo 'true';
}
Το i
στο τέλος της κανονικής έκφρασης αλλάζει την κανονική έκφραση ώστε να μην λαμβάνεται υπόψη η πεζότητα, αν δεν το θέλετε αυτό, μπορείτε να το αφήσετε έξω.
Τώρα, αυτό μπορεί να είναι αρκετά προβληματικό σε ορισμένες περιπτώσεις, καθώς η συμβολοσειρά $search δεν έχει καθαριστεί με κανένα τρόπο, εννοώ ότι μπορεί να μην περάσει τον έλεγχο σε ορισμένες περιπτώσεις, καθώς αν η $search
είναι είσοδος χρήστη μπορεί να προσθέσει κάποια συμβολοσειρά που μπορεί να συμπεριφέρεται σαν κάποια διαφορετική κανονική έκφραση...
Επίσης, εδώ'είναι ένα εξαιρετικό εργαλείο για να ελέγξετε και να δείτε επεξηγήσεις διαφόρων κανονικών εκφράσεων Regex101
Για να συνδυάσετε και τα δύο σύνολα λειτουργιών σε μια ενιαία συνάρτηση πολλαπλών χρήσεων (συμπεριλαμβανομένης της επιλεξιμότητας ευαισθησίας στην πεζότητα), θα μπορούσατε να χρησιμοποιήσετε κάτι σαν αυτό:
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.";
}
?>