Php 分隔符不能是字母数字或反斜杠且不匹配

Php 分隔符不能是字母数字或反斜杠且不匹配,php,regex,preg-match,Php,Regex,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]; 当im运行时,它返回以下错误: 警告: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];
当im运行时,它返回以下错误:

警告:preg_match()[function.preg match]:分隔符不能是字母数字或反斜杠


您的模式需要一个分隔符。应将其添加到图案的开始和结束处,如下所示:

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

请试试这个

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

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

$pattern = "/My name is '(.*)' and im fine/";
下面是相同的示例,但使用
i
修饰符进行匹配,而不区分大小写

$pattern = "/My name is '(.*)' and im fine/i";
如您所见,
i
在斜杠之外,因此被解释为修饰符

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

解决方案(其他答案至少在我最初撰写本文时没有提到)是,当PHP引用分隔符时,它不是指代码中的分隔符(引号),而是指字符串中的下一个字符。(事实上,我从未在任何文档中看到过这种说法:您必须在示例中看到它。)因此,不要像您在许多其他语言中习惯的那样使用正则表达式语法:

/something/
PHP使用字符串,然后在字符串内部查找另一个分隔符:

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

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

'/something/i'
如果您想使用
/
以外的内容作为分隔符,您可以这样做,例如,如果您正在匹配一个URL,并且不想转义所有的斜杠:

'~something~'

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

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";  
您还可以使用以下功能:


可能与原始代码示例无关,但我收到了错误“分隔符不能是字母数字或反斜杠”,并在这里搜索。
原因:我混合了preg_匹配的参数顺序。Pattern是第二个参数,要匹配的字符串是第一个参数。注意:)

如果您将所有参数作为变量传递给
preg\u match()
,这可能会对其他人有所帮助,确保不要在函数调用中意外混淆变量的顺序,因为这几乎肯定会导致出现相同的错误。您需要在regexp stringUse
$pattern=“/My name is'(.*)”和im fine/”中使用分隔符@Gruber:谢谢!您可以随时将所有朋友的链接发送到该网站,并让他们投票;)解释文档无法解释的内容+谢谢你!投票率最高的答案与此相同,但是,我很高兴现在能够理解为什么这是正确的答案+1谢谢!为什么要用括号括起来?@kiJey。在OP的情况下,他们希望提取名称,因此匹配需要括号,因此不能转义。这就是为什么我对它投了反对票。注意不要使用双引号来封装正则表达式,否则一些\+字符组合(例如换行符的
\l
)将转换为它们的字符,这可能会产生一个超出预期的表达式。使用单引号。请参阅。在本例中,字符串包含单引号,因此更容易使用双引号将其括起来(避免使用单引号将其括起来所需的转义
\'
)。我只是做了一个一般性评论,因为查看示例的人可能会将其视为自己的“cookie cut”,未意识到如果将其扩展到其他情况可能会发生的不可预见的后果。不幸的是,我不能把我的评论改得更具体。
$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();

                 // ↑ No delimiters needed