【问题标题】:Regular expression to capture string between square brackets正则表达式捕获方括号之间的字符串
【发布时间】:2011-01-04 03:30:05
【问题描述】:

我有一个数组,它的第一个元素 可能 包含类似 [some text, here. That's some text] 的内容 我试图找出一个模式来检查这样的字符串是否存在,如果不创建它但在制作模式时遇到问题。这是我到目前为止所做的事情

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

但我总是得到 [Unnamed import] - 032758 即使我确定模式匹配

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

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

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

    量词* 适用于它之前的部分,在这种情况下它适用于[。我猜你已经将* 与它在 shell 中的用法混淆了,它表示任何字符任意次数。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您正在检查一个字符串是否以[ 开头并以] 结尾。您也可以在没有正则表达式的情况下轻松完成:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-17
          • 2010-09-29
          • 2013-07-18
          • 2011-11-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多