2011-01-04 4 views
2

Ich habe ein Array, dass sein erstes Element Macht so etwas wie [some text, here. That's some text] enthält Ich versuche, ein Muster, um herauszufinden, zu prüfen, ob ein solche Zeichenfolge vorhanden ist, und wenn es nicht zu schaffen, sondern mit der Herstellung des Musters Problem mit . Hier ist, was ich bisher getanRegulärer Ausdruck

$pattern = '/^\[*\]$/'; 
if(preg_match($pattern,$exploded[0])){ 
    $name = array_shift($exploded); 
}else{ 
    $name = "[Unnamed import] - " .gmdate("His"); 
} 

Aber ich bekomme immer [Unbenannt Import] - 032758, selbst wenn ich bin sicher, dass Mustervergleich

Antwort

3

Die Regex ^\[*\]$ falsch ist.

^ - Start anchor 
\[ - A literal [ 
* - Quantifier for zero or more 
\] - A literal ] 
$ - End anchor 

Die quantifier * gilt für den Teil davor, in diesem Fall ist es zu [ gilt. Ich nehme an, Sie haben die * mit ihrer Verwendung in shell verwechselt, wo es beliebige Zeichen beliebig oft bedeutet.

So Ihre regex entspricht null oder mehr [ am Anfang des Strings und eine ] am Ende des Strings.

Das Äquivalent von Shell * in Regex ist .*, die beliebig viele Zeichen (außer Newline) passt. So können Sie versuchen, die Regex ^\[.*\]$

Alternativ können Sie versuchen: ^\[[^\]]*\]$

+0

funktioniert beide dank – afarazit

1

Die * selbst nicht mehrere Zeichen darstellt. Sie brauchen einen Punkt (= ein beliebiges Zeichen) gefolgt von dem Stern .*, sonst bedeutet das Sternchen, dass es null oder mehr Zeichen entspricht - weil es immer das vorhergehende Zeichen quantifiziert.

1

Sie überprüfen, ob eine Zeichenfolge mit [ beginnt und mit einer ] endet. Sie können es auch ohne Regex einfach tun, wie:

if(strlen($str) && $str[0] == '[' && $str[strlen($str)-1] == ']') { 
     // pattern found. 
}