我有这个代码:
$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/"; // With / as a delimeter
解决方案(其他答案没有提到 - 至少在我最初写这篇文章时)是,当 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
位于斜线之外,因此被解释为修饰符。
另请记住,如果您使用正斜杠字符 (/) 作为分隔符,则必须在正则表达式中转义进一步使用 /(如果存在)。
模式必须有分隔符。分隔符可以是正斜杠 (/) 或任何非字母数字字符(#、$、*、...)。示例
$pattern = "/My name is '(.*)' and im fine/";
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";
也许与原始代码示例无关,但我收到错误“分隔符不能是字母数字或反斜杠”并在此处 Google 搜索。 原因:我混合了 preg_match 的参数顺序。模式是第二个参数,要匹配的字符串是第一个参数。小心点:)
请尝试一下这个
$pattern = "/My name is '\(.*\)' and im fine/";