分隔符不得为字母数字或反斜杠以及preg_match


86

我有这个代码:

$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]:分隔符不得为字母数字或反斜杠


2
请注意,这可能对其他人有帮助,如果您将所有参数preg_match()作为变量传递,请确保您不会在函数调用中意外混合变量的顺序,因为这几乎肯定会导致相同的结果错误出现。
bluebinary

1
您需要在正则表达式字符串中使用定界符
KiJéy19年

2
使用$pattern = "/My name is '(.*)' and im fine/";
gk。

Answers:


133

您需要为模式设置定界符。应该将其添加到模式的开头和结尾,如下所示:

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter 

注意不要使用双引号将正则表达式括起来,否则某些\ +字符组合(例如\l换行符)将转换为它们的字符,这很可能会产生非预期的表达式。使用单引号。参见php字符串描述
Patanjali

在此示例中,字符串包括单引号,因此使用双引号将其括起来会更容易(避免了\'如果用单引号将其引起的转义)。
保罗

我当时提一个一般性评论,因为查看示例的人可能会将它们视为自己的“ cookie切割”工具,而没有意识到如果将示例扩展到其他情况可能会发生无法预料的后果。不幸的是,我无法将我的评论更改为更具体。
Patanjali

68

解决方案(其他答案没有提到,至少在我最初写这篇文章时没有提到)是,当PHP引用分隔符时,它不是引用您在代码中看到的分隔符(即引号),而是下一个字符串中的字符。(实际上,我从未在任何文档中的任何地方看到此说明:您必须在示例中看到它。)因此,与其像其他语言一样使用正则表达式语法,不如:

/something/

PHP使用字符串,然后在字符串中查找另一个定界符:

'/something/'

PHP所使用的定界符是一对/字符,而不是一对'字符。因此,如果您编写'something',PHP将s用作预期的分隔符,并抱怨您不允许使用字母数字字符作为分隔符。

因此,如果您要传递(例如)一个i以表示您希望不区分大小写的匹配,则可以在字符串内部但在正则表达式定界符外部传递它:

'/something/i'

如果要使用除/定界符以外的其他内容,则可以(例如,如果您要匹配的是URL并且不想转义所有的斜杠):

'~something~'

1
@Gruber:谢谢!您可以随时向您的所有朋友发送链接,并让他们投票;)
iconoclast 2015年

1
解释哪些文档无法解释。+1谢谢!
朱奥利维拉

获得最高支持的答案与此相同,但是,我现在很高兴地理解为什么这是正确的答案。+1谢谢!
不拘一格的

21

您必须为表达式指定定界符。分隔符是表达式的开始和结尾处使用的特殊字符,用于表示表达式的哪一部分。这使您可以使用修饰符和解释器来了解哪个是表达式,哪些是修饰符。如错误消息所述,定界符不能为反斜杠,因为反斜杠是转义字符。

$pattern = "/My name is '(.*)' and im fine/";

和下面的相同示例,但具有i匹配的修饰符而不区分大小写。

$pattern = "/My name is '(.*)' and im fine/i";

如您所见,i斜线之外的,因此被解释为修饰符。

还请记住,如果使用正斜杠字符(/)作为分隔符,则必须在正则表达式(如果存在)中转义对/的进一步使用。


7

模式必须具有定界符。分隔符可以是正斜杠(/)或任何非字母数字字符(#,$,*,...)。例子

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";  


0

可能与原始代码示例无关,但是我收到错误消息“分隔符不能为字母数字或反斜杠”,并在此处进行了搜索。原因:我混合了preg_match的参数顺序。模式是第二个参数,匹配的字符串是第一个。小心 :)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.