我有这段代码:
$string1 = "My name is 'Kate' and im fine";
$pattern = "My name is '(.*)' and im fine";
preg_match($pattern , $string1, $matches);
echo $matches[1];
当我运行它时,会返回以下错误:
警告:preg_match() [function.preg-match]:定界符不能是字母数字或反斜杠
我有这段代码:
$string1 = "My name is 'Kate' and im fine";
$pattern = "My name is '(.*)' and im fine";
preg_match($pattern , $string1, $matches);
echo $matches[1];
当我运行它时,会返回以下错误:
警告:preg_match() [function.preg-match]:定界符不能是字母数字或反斜杠
你的模式需要加上分隔符。它应该在模式的开头和结尾添加,如下所示:
$pattern = "/My name is '(.*)' and im fine/"; // With / as a delimeter
\l
表示换行符)将被转换为其对应的字符,这可能会导致意料之外的表达式。建议使用单引号。详见PHP字符串描述。 - Patanjali\'
如果它被包含在单引号中)。 - Paul解决方案(其他答案没有提到—至少在我最初编写本文时没有提到)是,当PHP引用定界符时,它不是指你在代码中看到的定界符(这些是引号),而是字符串内部的下一个字符。(事实上,我从未在任何文档中看到过这种说法:你必须在示例中看到它。)所以,与您可能习惯于从许多其他语言中使用的正则表达式语法不同:
/something/
PHP使用字符串,然后在字符串中查找另一个分隔符:
'/something/'
PHP所指的分隔符是一对/
字符,而不是一对'
字符。因此,如果您编写'something'
,PHP将把s
视为预定的分隔符,并抱怨您不允许使用字母数字字符作为分隔符。
因此,如果您想传递(例如)一个i
来显示您想要进行不区分大小写的匹配,可以将其传递到字符串内部但在正则表达式分隔符之外:
'/something/i'
如果你想使用除了/
之外的其他分隔符,那么你可以这样做,比如当你匹配一个URL而不想转义所有斜杠时:
如果您想使用其他分隔符,而不是/
,比如您要匹配一个URL,但不想转义所有的斜杠:
'~something~'
您必须为表达式指定分隔符。分隔符是一个特殊字符,用于表示表达式的开始和结束位置,以便您可以使用修饰符和解释器来确定哪部分是表达式,哪些是修饰符。正如错误信息所述,分隔符不能是反斜杠,因为反斜杠是转义字符。
$pattern = "/My name is '(.*)' and im fine/";
下面是相同的示例,但使用 i
修改器进行匹配而不区分大小写。
$pattern = "/My name is '(.*)' and im fine/i";
正如你所看到的,i
在斜杠之外,因此被解释为一个修饰符。
还要记住,如果你使用斜杠字符(/)作为定界符,则必须转义正则表达式中出现的其他斜杠。
这个模式必须有分隔符。分隔符可以是正斜杠 (/),也可以是任何非字母数字字符(#,$,*,...)。例子:
$pattern = "/My name is '(.*)' and im fine/";
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";
$pattern = "/My name is '\(.*\)' and im fine/";
preg_match()
函数,请确保在函数调用中不要意外混淆变量的顺序,否则几乎肯定会导致出现相同的错误。 - bluebinary$pattern = "/我的名字是'(.*)',我很好/";
- gk.