2011-10-05 51 views
45

我有这样的代码:分隔符不能是字母,数字或反斜线和的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运行,当它返回此错误:

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+0

作为一个说明可能会有所帮助别人,如果你是通过你所有的参数'的preg_match()'作为变量,确保你不会在无意中混入了变量的顺序函数调用,因为这几乎肯定会导致出现相同的错误。 – bluebinary

回答

86

您需要为您的图案的分隔符。它应该在模式的开始和结尾处添加像这样:

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

这应该是正确的答案。 –

1

请与本

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

为何不使用括号? –

18

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

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

和相同的例子,但以下用i改性剂以匹配而不区分大小写。

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

正如你所看到的,i是斜线之外,因此被解释为修饰。另外请记住,如果使用正斜杠字符(/)作为分隔符,则必须在正则表达式中进一步使用/,如果存在的话。

29

解决方案(其他答案至少在我最初写这篇文章的时候没有提到—)是当PHP引用分隔符时,它不是指您在代码中看到的分隔符(它们是引号)但字符串中的下一个字符。 (事实上​​,我从来没有见过这说明任何地方的任何文档中。你必须看到它的例子),所以,而不必像什么,你可以从许多其他语言习惯了一个正则表达式语法:

/something/ 

PHP使用字符串,然后查找里面的字符串为另一个分隔符:

'/something/' 

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

所以,如果你想通过(例如)的i表明你希望的情况下,钝感的比赛,你通过它里面的字符串,但外面的正则表达式的分隔符:

'/something/i' 

如果你想使用比/其他东西作为您的分隔符,就可以了,比如,如果你匹配一个URL,不希望有逃避所有的斜线:

'~something~' 
+1

不能满足这个足够的时间! – Gruber

+0

@Gruber:谢谢!您可以随时将所有朋友链接发送给它,让他们支持它;) – iconoclast

+0

解释什么文档无法解释.. +1谢谢! –

5

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

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#"; 
$pattern = "@My name is '(.*)' and im [email protected]"; 
相关问题