2013-03-14 10 views
5

È possibile utilizzare un carattere jolly in un'istruzione if?Stringa corrispondente con caratteri jolly in stile shell (ad esempio, *)

Il mio codice:

* = wildcard

if ($admin =='*@some.text.here') { 

} 

$admin sarà uno di questi:

+0

http://php.net/manual/en/function.preg-match.php – Teson

+0

No, ma probabilmente si può usare preg_match a così ciò che si desidera. – j08691

+0

cosa c'entra questo con IRC? –

risposta

13

Se non si desidera utilizzare le espressioni regolari, fnmatch() potrebbe essere utile per questo scopo [limitato]. Corrisponde a stringhe che utilizzano caratteri jolly simili a shell come ci si aspetta.

if (fnmatch('*@some.text.here', $admin)) { 

} 
+1

Ti darò un +1 per quello che non ho mai notato prima di questa funzione molto utile. – Dave

+0

fnmatch non riesce con avvisi sui nomi dei file che superano i 4096 caratteri. Dal momento che sto facendo corrispondere un set di dati non il nome del file non posso usare fnmatch – slebetman

+0

@slebetman Grazie. Buono a sapersi. – Wiseguy

1
if (strstr ($admin,"@some.text.here")) { 

} 

uso strstr() che farà ciò che si desidera o come sottolineato stristr()

Oppure si può utilizzare strpos qualcosa di simile

$pos = strrpos($mystring, "@some.text.here"); 
if ($pos === false) { // note: three equal signs 
    // not found... 
} else { 
    //found 
} 

O dalla fine (Penso che non l'abbia provato)

$checkstring = "@some.text.here"; 
$pos = strrpos($mystring, $checkstring, -(strlen($checkstring))); 
if ($pos === false) { // note: three equal signs 
    // not found... 
} else { 
    //found 
} 
+0

stristr è la versione senza distinzione tra maiuscole e minuscole di questo – Waygood

+0

Ciò presume che non importa se '@ some.text.here' si trova alla fine della stringa o meno. – Emissary

+0

Non ha dichiarato nel suo esempio se era specifico riguardo al fatto che si trovasse in una certa posizione nel testo solo che era nel testo. È sempre possibile utilizzare strpos con un offset strlen se si desidera eseguire la ricerca dalla fine della stringa anziché ovunque – Dave

3

Si può semplicemente verificare che la stringa termini con il valore che si ar e in attesa:

$suffix = '@some.text.here'; 

if (substr($admin, -strlen($suffix)) == $suffix) { 
    // Do something 
} 
0

Il metodo più veloce per verificare se una stringa si trova in un'altra stringa sarebbe strpos():

if (strpos($admin, '@some.test.here') !== false) { } 

Se avete bisogno di essere certi che si verifica @ some.text.here alla fine, vorrete usare substr_compare() invece.

if (substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0) {} 
+0

se inizia con quello, la posizione restituita è 0 = falso - vedi la risposta di Dave – Waygood

+0

Se il problema è che '0' è implicitamente convertito in' false', _esplicitamente_ convertendolo in 'false' (con' !! 'o direct casting) non cambierà questo. – Wiseguy

+0

Oh wow, assolutamente corretto. Non so a cosa stavo pensando. – Sturm

3

Ecco una funzione con caratteri jolly per voi.
Come si sta cercando di utilizzare * solo ho commentato il . (corrispondenza di singolo carattere).

Questo vi permetterà di utilizzare i caratteri jolly per tutto:
*xxx - conclude "xxx"
xxx* - inizia "XXX"
xx*zz - comincia con "xx" e termina con "zz"
*xx* - ha " xx" nel mezzo

function wildcard_match($pattern, $subject) 
{ 
    $pattern='/^'.preg_quote($pattern).'$/'; 
    $pattern=str_replace('\*', '.*', $pattern); 
    //$pattern=str_replace('\.', '.', $pattern); 
    if(!preg_match($pattern, $subject, $regs)) return false; 
    return true; 
} 
if (wildcard_match('*@some.text.here', $admin)) { 

} 

ma suggerisco imparare ad usare regular expressions con preg_match() te stesso.

+2

Dai un'occhiata a ['fnmatch()'] (http://php.net/fnmatch). – Wiseguy

+0

ooooh! mai visto prima! Bello! – Waygood

Problemi correlati