我有一个数组,其第一个元素可能包含类似[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
正则表达式^\[*\]$
不正确。
^ - Start anchor
\[ - A literal [
* - Quantifier for zero or more
\] - A literal ]
$ - End anchor
量词*
适用于它之前的部分,在这种情况下它适用于[
。我想你已经把*
和它在shell中的用法混淆了,它意味着任何字符都是任意次。
所以你的正则表达式在字符串的开头匹配零个或多个[
,在字符串的末尾匹配一个]
。
正则表达式中shell的*
的等价物是.*
,它可以任意次数匹配任何字符(换行符除外)。所以你可以试试正则表达式^\[.*\]$
或者你可以尝试:^\[[^\]]*\]$
*
本身并不代表多个角色。你需要点(=任何字符)后跟星号.*
,否则星号表示匹配零个或多个[
字符 - 因为它总是量化前面的字符。
您正在检查字符串是否以[
开头并以]
结尾。您可以轻松地执行此操作而无需正则表达式:
if(strlen($str) && $str[0] == '[' && $str[strlen($str)-1] == ']') {
// pattern found.
}