preg_match per le frasi che iniziano con "for the"
-
20-09-2019 - |
Domanda
Abbastanza semplice ma non riesco a far funzionare la sintassi esatta.
Voglio solo un controllo vero o falso per vedere se una stringa contiene "for the" (senza distinzione tra maiuscole e minuscole).
Soluzione
Se è solo che, allora si potrebbe utilizzare normale ricerca testuale:
if (stripos("for the", $text) === 0) { // case-insensitive here
// string starts with "for the"
}
In alternativa,
if (substr($text, 0, 7) == "for the")
I commenti che seguono mi ha fatto chiedo su che in realtà è più veloce, così ho scritto un po 'di benchmarking.
Ecco la versione TLDR:
-
strpos
è veramente veloce se non stai lavorando con stringhe di grandi dimensioni. -
strncmp
è affidabile e veloce. -
preg_match
non è mai una buona opzione.
Ecco la versione lunga:
- Due diversi "pagliai":
- 10000 caratteri di lipsum
- 83 caratteri del lipsum.
- 5 diversi metodi di ricerca:
- strpos :
return strpos($haystack, $needle) === 0
- preg_match
return preg_match("/^$needle/", $haystack) === 1
- substr
return substr($haystack, 0, strlen($needle)) === $needle
- strncmp
return strncmp($needle, $haystack, strlen($needle)) === 0
- looping manuale:
- strpos :
for ($i = 0, $l = strlen($needle); $i < $l; ++$i) {
if ($needle{$i} !== $haystack{$i}) return false;
}
return true;
- 7 diversi "aghi"
- 3 corrispondenti (lunghezza: 83, 5 e 1 carattere)
- 4 non corrispondenti (lunghezze: 83, 82, 5 e 1 caratteri). L'ago 82 char non corrisponde affatto, e gli aghi di carattere 83 corrisponde a tutti, ma l'ultimo carattere.
- 100.000 iterazioni, per il metodo per l'ago per pagliaio
punti interessanti:
- Il test più veloce individuale di tutti è stato
strpos
sulla lunga, tutto l'ago non corrispondenti contro il breve pagliaio.- Infatti, dei 14 test eseguiti per ciascun metodo,
strpos
registrato all'inizio 11 volte.
- Infatti, dei 14 test eseguiti per ciascun metodo,
- La prova individuale più lento è il metodo manuale sugli aghi lunghi, indipendentemente dalle dimensioni pagliaio. Quei quattro prove erano 10-20 volte più lento di quasi tutti gli altri test.
- Anche se
strpos
hanno avuto la migliore performance, è stato appesantito dai lunghi aghi non corrispondenti sul lungo pagliaio. Erano 5-10 volte più lento rispetto maggior parte dei test. -
strncmp
era veloce e il più coerente. -
preg_match
è stato costantemente circa 2 volte più lento rispetto alle altre funzioni
Haystack: 83 characters
______________________________________________________________
____________|__________ non-matching ___________|_______ matching ________|
| function | 1 | 5 | 82 | 83 | 1 | 5 | 83 |
|------------+--------+--------+--------+--------+--------+--------+--------|
| manual | 0.2291 | 0.2222 | 0.2266 | 4.1523 | 0.2337 | 0.4263 | 4.1972 |
| preg_match | 0.3622 | 0.3792 | 0.4098 | 0.4656 | 0.3642 | 0.3694 | 0.4658 |
| strncmp | 0.1860 | 0.1918 | 0.1881 | 0.1981 | 0.1841 | 0.1857 | 0.1980 |
| strpos | 0.1596 | 0.1633 | 0.1537 | 0.1560 | 0.1571 | 0.1589 | 0.1681 |
| substr | 0.2052 | 0.2066 | 0.2009 | 0.2166 | 0.2061 | 0.2017 | 0.2236 |
-----------------------------------------------------------------------------
Haystack: 10000 characters
______________________________________________________________
____________|__________ non-matching ___________|_______ matching ________|
| function | 1 | 5 | 82 | 83 | 1 | 5 | 83 |
|------------+--------+--------+--------+--------+--------+--------+--------|
| manual | 0.2275 | 0.2249 | 0.2278 | 4.1507 | 0.2315 | 0.4233 | 4.1834 |
| preg_match | 0.3597 | 0.3628 | 0.4147 | 0.4654 | 0.3662 | 0.3679 | 0.4684 |
| strncmp | 0.1886 | 0.1914 | 0.1835 | 0.2014 | 0.1851 | 0.1854 | 0.1989 |
| strpos | 0.1605 | 2.1877 | 2.3737 | 0.5933 | 0.1575 | 0.1597 | 0.1667 |
| substr | 0.2073 | 0.2085 | 0.2017 | 0.2152 | 0.2036 | 0.2090 | 0.2183 |
-----------------------------------------------------------------------------
Altri suggerimenti
Si desidera utilizzare ^
a significare l'inizio di una stringa:
$string_one = "For the love of Mike";
$string_two = "for the amazing reason.";
$match = preg_match("/^for the/i", $string_one); // Outputs 1
$match = preg_match("/^for the/i", $string_two); // Outputs 1
Il /i
è la parte che rende il caso di ricerca insensitive.
Che ne dite di
if(preg_match("/^for the/", $yourString))
{
return true;
}
else
{
return false;
}
Prendere nota del codice di ^
, corrisponde all'inizio di una stringa.
Se avete avuto rel="nofollow leggere il primo esempio nella documentazione avreste visto la risposta.
if ( preg_match('/^for the/i', $sentence) )
{
// a match was found
}
l'espressione regolare è /^for the/i