我有这个代码:
$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/";
Answers:
解决方案(其他答案没有提到,至少在我最初写这篇文章时没有提到)是,当PHP引用分隔符时,它不是引用您在代码中看到的分隔符(即引号),而是下一个字符串中的字符。(实际上,我从未在任何文档中的任何地方看到此说明:您必须在示例中看到它。)因此,与其像其他语言一样使用正则表达式语法,不如:
/something/
PHP使用字符串,然后在字符串中查找另一个定界符:
'/something/'
PHP所使用的定界符是一对/
字符,而不是一对'
字符。因此,如果您编写'something'
,PHP将s
用作预期的分隔符,并抱怨您不允许使用字母数字字符作为分隔符。
因此,如果您要传递(例如)一个i
以表示您希望不区分大小写的匹配,则可以在字符串内部但在正则表达式定界符外部传递它:
'/something/i'
如果要使用除/
定界符以外的其他内容,则可以(例如,如果您要匹配的是URL并且不想转义所有的斜杠):
'~something~'
您必须为表达式指定定界符。分隔符是表达式的开始和结尾处使用的特殊字符,用于表示表达式的哪一部分。这使您可以使用修饰符和解释器来了解哪个是表达式,哪些是修饰符。如错误消息所述,定界符不能为反斜杠,因为反斜杠是转义字符。
$pattern = "/My name is '(.*)' and im fine/";
和下面的相同示例,但具有i
匹配的修饰符而不区分大小写。
$pattern = "/My name is '(.*)' and im fine/i";
如您所见,i
斜线之外的,因此被解释为修饰符。
还请记住,如果使用正斜杠字符(/)作为分隔符,则必须在正则表达式(如果存在)中转义对/的进一步使用。
preg_match()
作为变量传递,请确保您不会在函数调用中意外混合变量的顺序,因为这几乎肯定会导致相同的结果错误出现。