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

当我运行它返回这个错误:

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

你的模式需要一个分隔符。 它应该在模式的开始和结束处添加,如下所示:

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

解决scheme(其他答案没有提到 – 至less在我写这篇文章的时候)是当PHP引用分隔符时,它不是指你在代码中看到的分隔符(它是引号),而是下一个string内的字符。 (事实上​​,我从来没有在任何文档中的任何地方看到过这种情况:所以你必须在例子中看到它。)所以,不要使用像其他许多语言习惯的正则expression式语法:

 /something/ 

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

 '/something/' 

PHP所指的分隔符是一对/字符,而不是“一对'字符。 所以,如果你写'something' ,PHP会把s作为预定的分隔符,并抱怨你不允许使用字母数字字符作为你的分隔符。

所以,如果你想通过(例如) i显示你想不区分大小写匹配,你传递它的string内,但正则expression式分隔符之外:

 '/something/i' 

如果你想使用除/以外的分隔符,你可以,例如,如果你匹配一个URL,而不想逃避所有的斜杠:

 '~something~' 

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

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

和下面的例子,但与i修改匹配,而不区分大小写。

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

正如你所看到的, i是在斜杠外,因此被解释为一个修饰符。

另外请记住,如果使用正斜杠字符(/)作为分隔符,则必须在正则expression式中进一步使用/。

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

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

请试试这个

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