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

问题描述 投票:0回答:7

我有这个代码:

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

php regex preg-match
7个回答
160
投票

您的模式需要一个分隔符。它应该添加在模式的开头和结尾,如下所示:

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

86
投票

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

/something/

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

'/something/'

PHP 所指的分隔符是一对

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

因此,如果您想传递(例如)一个

i
来表明您想要不区分大小写的匹配,则可以将其传递到字符串内部但在正则表达式分隔符之外:

'/something/i'

如果您想使用

/
以外的其他内容作为分隔符,则可以,例如您正在匹配 URL 并且不想转义所有斜杠:

'~something~'

24
投票

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

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

和下面的示例相同,但使用

i
修饰符进行匹配而不区分大小写。

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

如您所见,

i
位于斜线之外,因此被解释为修饰符。

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


8
投票

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

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

1
投票

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


0
投票

您还可以使用 T-Regx 库,它为您提供 自动分隔符

$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();

                 // ↑ No delimiters needed 

-2
投票

请尝试一下这个

$pattern = "/My name is '\(.*\)' and im fine/"; 
© www.soinside.com 2019 - 2024. All rights reserved.