【问题标题】:Delimiter must not be alphanumeric or backslash and preg_match分隔符不能是字母数字或反斜杠和 preg_match
【发布时间】:2011-10-05 11:25:51
【问题描述】:

我有这个代码:

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

【问题讨论】:

  • 作为可能对其他人有帮助的注释,如果您将所有参数作为变量传递给preg_match(),请确保您不会在函数中意外混淆变量的顺序调用,因为这也几乎肯定会导致出现同样的错误。
  • 您的正则表达式字符串中需要一个分隔符
  • 使用$pattern = "/My name is '(.*)' and im fine/";

标签: php regex preg-match


【解决方案1】:

您的模式需要一个分隔符。它应该像这样添加在模式的开头和结尾:

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

【讨论】:

  • 谨防使用双引号将正则表达式括起来,否则某些\+字符组合(例如\l 换行)将转换为它们的字符,这很可能会产生与预期不同的表达式.使用单引号。见php Strings description
  • 在此示例中,字符串包含单引号,因此使用双引号将其括起来更容易(避免使用单引号引起的转义 \')。
  • 我是在发表一般性评论,因为查看示例的人可能会将它们视为为自己“千篇一律”的东西,而没有意识到如果将其扩展到其他情况可能会发生的不可预见的后果。不幸的是,我无法将我的评论更改得更具体。
【解决方案2】:

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

/something/

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

'/something/'

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

因此,如果您想传递(例如)i 以表明您想要一个不区分大小写的匹配,您可以在字符串内部但在正则表达式分隔符之外传递它:

'/something/i'

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

'~something~'

【讨论】:

  • @Gruber:谢谢!您可以随时将所有朋友的链接发送给它并让他们投票;)
  • 解释什么文档没有解释.. +1 谢谢!
  • 最高投票的答案与此相同,但是,我很高兴现在了解为什么这是正确的答案。 +1 谢谢!
【解决方案3】:

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

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

以下是相同的示例,但使用 i 修饰符匹配而不区分大小写。

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

如您所见,i 在斜线之外,因此被解释为修饰符。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      您也可以使用T-Regx library,它为您提供automatic delimiters

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          请试试这个

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

          【讨论】:

          • 为什么要转义括号?
          • @kiJey。在 OP 的情况下,他们想提取名称,因此匹配需要括号,因此不能转义。这就是我反对它的原因。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 2011-02-01
          • 2016-07-26
          相关资源
          最近更新 更多