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