【问题标题】:RegEx that works in Javascript won't do so in PHP在 Javascript 中工作的 RegEx 在 PHP 中不会这样做
【发布时间】:2017-06-09 21:00:15
【问题描述】:

我会尽量让我的问题简短而易于理解,我在 javascript 中使用了一个简单的 RegEx 来检查不是字母数字的字符(AKA 符号)。应该是 "/[$-/:-?{-~!"^_`[]]/"

在javascript中,做

if(/[$-/:-?{-~!"^_`\[\]]/.test( string ))

正常工作,如果字符串中有任何这些字符,它将给出 true,否则,它将给出 false。我尝试在PHP中做同样的事情,如下方式

if(preg_match('/[$-/:-?{-~!"^_`\[\]]/', $string ))

其他正则表达式以这种方式工作,但无论在 PHP 中运行什么,这个特定的正则表达式都会返回 false。

这有什么理由吗?难道我做错了什么? PHP 是否以不同的方式理解正则表达式?我应该改变什么才能让它工作?

感谢您的宝贵时间。

【问题讨论】:

  • / 是您的分隔符,您需要在该字符类中对其进行转义。很惊讶在 JS 中没有引发问题。另外$-/ 不是$-/,它是一个范围(36 - 47、asciitable.com/index/asciifull.gif
  • @chris85 我认为这是因为 javascript 正则表达式不是字符串,因此它将 / 视为开放字符类的一部分。不过我也很惊讶。
  • 然而,OP,与其列出一堆你不想要的字符,不如创建一个你想要的字符模式。您提供的列表不是数千个所有符号字符的完整列表。不同的键盘布局具有您没有或看不到的字符。你最好使用像/[^a-zA-Z0-9]/ 这样的否定字符类,这意味着匹配任何不是字母或数字的东西。类开头的^ 表示NOT 这些字符。
  • 由于 php 使用 PCRE,因此使用分隔符 / 会出现模式错误,如此处所示 regex101.com/r/3ILGgE/1
  • 问题已更正,谢谢大家。我会记住否定方法。

标签: javascript php regex


【解决方案1】:

由于 php 使用 PCRE,因此使用分隔符 / 时会出现模式错误,如此处所示 http://regex101.com/r/3ILGgE/1

所以,它应该被正确地转义。

使用/作为分隔符,字符串为

'/[$-\/:-?{-~!"^_`\[\]]/'  

使用~作为分隔符,字符串为

'~[$-/:-?{-\~!"^_`\[\]]~'  

另外,请注意,$-/:-?{-~ 类中有几个范围
这也将包括从/到范围字符之间的字符
并且 包含范围字符 - 本身,因为它是一个运算符。

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多