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

问题描述 投票:2回答:3

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

php regex preg-match
3个回答
3
投票

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

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

量词*适用于它之前的部分,在这种情况下它适用于[。我想你已经把*和它在shell中的用法混淆了,它意味着任何字符都是任意次。

所以你的正则表达式在字符串的开头匹配零个或多个[,在字符串的末尾匹配一个]

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

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


1
投票

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


1
投票

您正在检查字符串是否以[开头并以]结尾。您可以轻松地执行此操作而无需正则表达式:

if(strlen($str) && $str[0] == '[' && $str[strlen($str)-1] == ']') {
        // pattern found.
}
© www.soinside.com 2019 - 2024. All rights reserved.