2013-03-14 6 views
5

Ist es möglich, einen Platzhalter in einer If-Anweisung zu verwenden?Passende Zeichenfolge mit Shell-Wildcards (z. B. *)

Mein Code:

* = Wildcard

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

} 

$admin wird einer von diesen sein:

+0

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

+0

Nein, aber Sie können sich wahrscheinlich verwenden preg_match zu so was Sie wollen. – j08691

+0

Was hat das mit IRC zu tun? –

Antwort

13

Wenn Sie keine regulären Ausdrücke verwenden möchten, könnte fnmatch() Ihnen für diesen [begrenzten] Zweck gut dienen. Es entspricht Zeichenfolgen mit Shell-ähnlichen Platzhaltern, wie Sie es erwarten.

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

} 
+1

Ich gebe dir eine +1 dafür, dass ich diese Funktion noch nie zuvor bemerkt habe, sehr nützlich. – Dave

+0

fnmatch schlägt mit Warnungen fehl, wenn die Dateinamen länger als 4096 Zeichen sind. Da ich einen Dataset nicht filename kann ich nicht verwenden fnmatch – slebetman

+0

@slebetman Danke. Gut zu wissen. – Wiseguy

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

} 

Verwendung strstr(), es wird tun, was Sie wollen oder wie erwähnt stristr()

Oder Sie können strpos so etwas wie dieses

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

Oder von Ende verwenden (Ich glaube nicht getestet)

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

stristr ist die case insensitive Version dieses – Waygood

+0

Dies setzt voraus, dass es egal ist, ob '@ some.text.here' am Ende der Zeichenfolge steht oder nicht. – Emissary

+0

Er hat in seinem Beispiel nicht angegeben, ob er genau an einem bestimmten Ort im Text war, nur dass es im Text war. Sie können strpos immer mit einem strlen-offset verwenden, wenn Sie vom Ende des Strings aus und nicht irgendwo suchen wollen. – Dave

3

Sie könnten nur überprüfen, ob die Zeichenfolge mit dem Wert endet, den Sie ar sind e erwarten:

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

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

Die schnellste Methode, um zu überprüfen, ob eine Zeichenfolge in einer anderen Zeichenfolge gefunden wird, wäre strpos():

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

Wenn Sie sicher sein müssen, dass @ some.text.here auftritt Am Ende möchten Sie stattdessen substr_compare() verwenden.

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

Wenn es damit beginnt, ist die zurückgegebene Position 0 = false - siehe Daves Antwort – Waygood

+0

Wenn das Problem ist, dass "0" implizit in "false" konvertiert wird, _explicitly_ konvertiert es in "false" (mit '!!' oder direct Casting) wird das nicht ändern. – Wiseguy

+0

Oh wow, absolut richtig. Ich weiß nicht, was ich darüber dachte. – Sturm

3

Hier ist eine Wildcard-Funktion für Sie.
Da Sie nur * verwenden möchten, habe ich die . (single character match) auskommentiert.

Dies ermöglicht es Ihnen Platzhalter verwenden überall:
*xxx - endet "xxx"
xxx* - startet "xxx"
xx*zz - beginnt mit "xx" und endet mit "zz"
*xx* - hat " xx“in der Mitte

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)) { 

} 

aber ich schlage vor Lernen regular expressions mit preg_match() selbst zu verwenden.

+2

Werfen Sie einen Blick auf ['fnmatch()'] (http://php.net/fnmatch). – Wiseguy

+0

ooooh! noch nie zuvor gesehen! Nett! – Waygood