Регулярное выражение для захвата строки в квадратных скобках - PullRequest
2 голосов
/ 04 января 2011

У меня есть массив, его первый элемент может содержит что-то вроде [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 ]

3 голосов
/ 04 января 2011

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

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

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

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

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

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

1 голос
/ 04 января 2011

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

if(strlen($str) && $str[0] == '[' && $str[strlen($str)-1] == ']') {
        // pattern found.
}
1 голос
/ 04 января 2011

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

...