2011-01-04 4 views
2

У меня есть массив, что его первый элемент мощь содержит что-то вроде [some text, here. That's some text] Я пытаюсь выяснить, шаблон, чтобы проверить, если такая строка существует, и если не создать его, но возникли проблемы с созданием шаблона , Вот что я сделал до сих порРегулярное выражение

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

Но я всегда получаю [Безымянный импорта] - 032758, даже когда я уверен, что картина матча

ответ

3

Регулярное выражение ^\[*\]$ неверен.

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

Квантификатор * относится к той части до этого, в данном случае это относится к [. Я думаю, вы путаете * с его использованием в оболочке , где это означает любые символы сколько угодно раз.

Таким образом, ваше регулярное выражение соответствует нулю или более [ в начале строки и один ] в конце строки.

Эквивалент оболочки * в regex равен .*, который соответствует любому символу (кроме новой строки) любое количество раз. Таким образом, вы можете попробовать регулярное выражение ^\[.*\]$

В качестве альтернативы вы можете попробовать: ^\[[^\]]*\]$

+0

обе работы спасибо – afarazit

1

* сама по себе не представляет несколько символов. Вам нужна точка (= любой символ), за которой следует звездочка .*, иначе звездочка означает совпадение нуля или более [ символов - потому что она всегда количественно предшествует символу.

1

Вы проверяете, начинается ли строка с [ и заканчивается ]. Вы можете легко сделать это без регулярного выражения:

if(strlen($str) && $str[0] == '[' && $str[strlen($str)-1] == ']') { 
     // pattern found. 
} 
Смежные вопросы