我有一个数组,其第一个元素 可能 包含[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,即使我确定模式匹配
答案 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.
}