【问题标题】:PHP regular expression - match from start and end of stringPHP 正则表达式 - 从字符串的开头和结尾匹配
【发布时间】:2011-11-26 12:21:52
【问题描述】:

我使用在线正则表达式 (regex) 测试器构建了一个简单的正则表达式,但是使用 PHP 的 preg_match 它为 $ 提供了一个未知的修饰符。

这是正则表达式:

if (preg_match('/(^Keyword1/$|^Keyword2/$)/', $input, $matches))

我正在尝试检查 $input 是否等于 Keyword1/ 或 Keyword2/(完全匹配)。我知道我可以使用“if ($input == 'Keyword1/')”轻松做到这一点,但是我宁愿在代码中使用几行正则表达式而不是十几个 if 语句。

我该如何解决?

【问题讨论】:

  • 注意,您还可以使用允许的关键字数组和in_array

标签: php regex


【解决方案1】:

您需要转义正则表达式中的/,因为/ 也被用作分隔符:

if (preg_match('/(^Keyword1\/$|^Keyword2\/$)/', $input, $matches))
                           ^            ^

或者,使用不同的分隔符:

if (preg_match('~(^Keyword1/$|^Keyword2/$)~', $input, $matches))
                ^                         ^

由于您的两个子正则表达式都有共同的锚点,您可以将您的正则表达式简化为:

 if (preg_match('~^(Keyword1|Keyword2)/$~', $input, $matches))

为什么在你的正则表达式中出现警告?

'/(^Keyword1/$|^Keyword2/$)/'

由于您使用/ 作为分隔符,因此您的正则表达式中的第二个/ 会使PHP 认为它是您的正则表达式的结尾。现在 PHP 在结束分隔符之后接受像 smi 这样的正则表达式修饰符。但在您的情况下,PHP 在结束分隔符后看到 $。由于$ 不是有效的修饰符,您会收到警告:

PHP 警告:preg_match(): Unknown modifier '$' in ...

【讨论】:

    【解决方案2】:

    问题是您在正则表达式中使用了/ 而没有转义它。

    这就是你要找的东西,但可能会好一点:

    '/^(Keyword1|Keyword2)\\/$/'
    

    【讨论】:

      【解决方案3】:

      用途:

      preg_match('/^Keyword[1-2]\/$/', $input, $matches)
      

      【讨论】:

      • [12] 也会这样做,但我会假设“keyword1”只是一个示例,而不是他正在寻找的 actual 字符串。跨度>
      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 2016-12-07
      • 2013-09-02
      • 2022-08-03
      • 1970-01-01
      • 2023-01-02
      • 2013-08-04
      • 2018-02-13
      相关资源
      最近更新 更多