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