正则表达式捕获方括号之间的字符串

时间:2011-01-04 03:30:06

标签: php regex preg-match

我有一个数组,其第一个元素 可能 包含[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 个答案:

答案 0 :(得分:3)

正则表达式^\[*\]$不正确。

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

量词*适用于之前的部分,在这种情况下,它适用于[。我猜您已将*与其在 shell中的用法混淆,其中任意字符均为任意次。

因此,您的正则表达式在字符串的开头与[的零个或多个匹配,在字符串的末尾匹配一个]

正则表达式中shell *的等价物是.*,它可以任意次数匹配任何字符(换行符除外)。所以你可以试试正则表达式^\[.*\]$

或者您可以尝试:^\[[^\]]*\]$

答案 1 :(得分:1)

*本身并不代表多个字符。你需要点(=任何字符)后面跟星号.*,否则星号表示匹配零个或多个[字符 - 因为它总是量化前面的字符。

答案 2 :(得分:1)

您正在检查字符串是以[开头,还是以]结尾。你可以很容易地做到没有正则表达式:

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