我有这段代码:
$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]:分隔符不能是字母数字或反斜杠
答案 0 :(得分:105)
您的模式需要一个分隔符。它应该在模式的开头和结尾添加,如下所示:
$pattern = "/My name is '(.*)' and im fine/"; // With / as a delimeter
答案 1 :(得分:53)
解决方案(其他答案没有提及 - 至少在我最初写这篇文章的时候)是当PHP引用分隔符时,它不是指你在代码中看到的分隔符(引号)但字符串中的下一个字符。 (事实上,我从未在任何文档中看到过这种说法:你必须在示例中看到它。)因此,不要像许多其他语言那样习惯于正则表达式语法:
/something/
PHP使用字符串,然后在字符串中查找 另一个 分隔符:
'/something/'
PHP引用的分隔符是/
个字符对,而不是'
个字符对。因此,如果您编写'something'
,PHP会将s
作为预定的分隔符,并抱怨您不允许使用字母数字字符作为分隔符。
因此,如果你想传递(例如)一个i
以表明你想要一个不区分大小写的匹配,你将它传递到字符串中但在正则表达式分隔符之外:
'/something/i'
如果你想使用/
之外的其他东西作为分隔符,你可以,例如,如果你匹配一个URL而不想逃避所有斜杠:
'~something~'
答案 2 :(得分:20)
您必须为表达式指定分隔符。分隔符是在表达式的开头和结尾使用的特殊字符,用于表示哪个部分是表达式。这允许您使用修饰符和解释器来知道哪个是表达式,哪个是修饰符。正如错误消息所述,分隔符不能是反斜杠,因为反斜杠是转义字符。
$pattern = "/My name is '(.*)' and im fine/";
并且在相同的示例下方,但要匹配i
修饰符而不区分大小写。
$pattern = "/My name is '(.*)' and im fine/i";
如您所见,i
在斜杠之外,因此被解释为修饰符。
另外请记住,如果使用正斜杠字符(/)作为分隔符,则必须在正则表达式中进一步使用/(如果存在)。
答案 3 :(得分:5)
模式必须有分隔符。分隔符可以是正斜杠(/)或任何非字母数字字符(#,$,*,...)。示例
UserSummary
答案 4 :(得分:0)
请尝试使用此
$pattern = "/My name is '\(.*\)' and im fine/";
答案 5 :(得分:0)
您还可以使用T-Regx library,其中有automatic delimiters个适合您:
$string1 = "My name is 'Kate' and im fine";
$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();
// ↑ No delimiters needed
答案 6 :(得分:0)
也许与原始代码示例无关,但我收到错误消息“分隔符不能为字母数字或反斜杠”,并在此处进行了搜索。 原因:我混合了preg_match的参数顺序。模式是第二个参数,匹配的字符串是第一个。小心:)