V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ChoateYao
V2EX  ›  PHP

PHP 果然是最好的语言之正则的兼容问题。

  •  
  •   ChoateYao · 2016-03-09 12:04:40 +08:00 · 3753 次点击
    这是一个创建于 3183 天前的主题,其中的信息可能已经有所发展或是发生改变。

    测试一个匹配字母和数字的正则:

    pattern='/^\w+$/'
    string='人 1994'
    

    PHP 结果

    Array
    (
        [0] => 人 1994
    )
    

    Javascript 结果

    匹配不到数据

    结论
    PHP 是世界上最好的语言,我在这个细节上浪费了 30 分钟。

    如果要匹配字母和数字最好使用以下方法:

    /^[a-zA-Z\d_]+$/
    
    第 1 条附言  ·  2016-03-09 12:56:37 +08:00
    空格问题是 V2 编辑器造成的。
    第 2 条附言  ·  2016-03-09 13:00:28 +08:00
    http://php.net/manual/zh/regexp.reference.character-classes.php

    嗯,作为官方文档。可以让一些没有看过文档的人闭嘴了。

    然后使用[:alnum:]和\w 的结果是一样的。
    第 3 条附言  ·  2016-03-09 13:01:42 +08:00
    然后你们做测试的时候难道不会替换字符吗?
    如果我把"人"替换成其他字符呢?
    29 条回复    2016-03-10 15:04:17 +08:00
    milklee
        1
    milklee  
       2016-03-09 12:14:04 +08:00
    虽然在 js 里 \w 是不能匹配到汉字的。。但是按照标准来说,\w 也不会匹配空格才对

    所以为什么在 php 里 /^\w+$/ 会匹配到 '人 1994' 中间的空格?= =
    Strikeactor
        2
    Strikeactor  
       2016-03-09 12:14:50 +08:00


    顺便楼主例子错了,你字符串中间有空格, PHP 的匹配结果也是空的

    wjfz
        3
    wjfz  
       2016-03-09 12:15:53 +08:00
    莫非是 V2E 自动加的空格?

    这个孩子是 1994 年生的。
    wjfz
        4
    wjfz  
       2016-03-09 12:16:16 +08:00   ❤️ 1
    果然是 V2 自动加的空格。
    cccRaim
        5
    cccRaim  
       2016-03-09 12:16:59 +08:00
    一般来说, js 后面要加个 g 才是正常的匹配结果
    drush
        6
    drush  
       2016-03-09 12:22:33 +08:00
    排除 v2 自動加空格,有什麼問題?
    xuboying
        7
    xuboying  
       2016-03-09 12:23:07 +08:00 via Android   ❤️ 1
    感觉用\w 匹配汉字由 locale 决定,保险起见我只用\p{Han}
    4641585
        8
    4641585  
       2016-03-09 12:28:10 +08:00
    @wjfz

    V2 加空格不会加到代码段里吧
    lianz
        9
    lianz  
       2016-03-09 12:28:21 +08:00
    RTFM
    又是一个不看文档就直接喷的人,你干嘛不去喷飞机能在天上飞、火车能在铁轨上跑、自行车能骑呢。
    zakokun
        10
    zakokun  
       2016-03-09 12:35:17 +08:00   ❤️ 2
    PHP 确实有很多缺点.
    但是普通程序员还没那个资格喷吧?
    dangyuluo
        11
    dangyuluo  
       2016-03-09 12:55:57 +08:00
    @zakokun yes
    eoo
        12
    eoo  
       2016-03-09 13:50:14 +08:00
    .......................
    BOYPT
        13
    BOYPT  
       2016-03-09 13:53:59 +08:00   ❤️ 1
    有啥好争的,本来 regex 就有好几种口味,较流行的就是 php/js/python 几种口味
    https://regex101.com/ 可以在线测试
    eoo
        14
    eoo  
       2016-03-09 13:54:49 +08:00
    @Strikeactor 这是什么网站?
    matsuijurina
        15
    matsuijurina  
       2016-03-09 13:57:01 +08:00 via Android
    当时 V2EX 自动加空格的时候就有人预料到会出现楼主这样的问题,认为不能为了排版的美观影响了内容的表达。
    Jaylee
        16
    Jaylee  
       2016-03-09 14:03:22 +08:00   ❤️ 1


    是我姿势有问题? 怎么什么阿猫阿狗都来喷?
    ChoateYao
        17
    ChoateYao  
    OP
       2016-03-09 14:27:45 +08:00
    slixurd
        19
    slixurd  
       2016-03-09 14:31:42 +08:00
    我觉得是字符集问题,试了一下几个 online 的 php 运行平台,有的可以有的不行
    版本没有什么影响,另外楼上的别随便喷啊,别人的运行环境都没了解....
    phithon
        20
    phithon  
       2016-03-09 14:37:06 +08:00   ❤️ 1
    还是跟本地编码有关系吧,允许是 php 一个 bug 吧。
    国外的机器是没问题的: https://3v4l.org/rNgfi
    语言有坑也正常,任何语言都有自己的坑和 BUG 。你浪费了 30 分钟,只能说明你看不穿这个问题,还得多多学习怎么解决问题,而不是怪别人。
    eoo
        21
    eoo  
       2016-03-09 14:40:19 +08:00
    @Jaylee 你这个没啥问题啊
    jfcherng
        22
    jfcherng  
       2016-03-09 15:52:07 +08:00
    /^\w+$/u 匹配成功!?
    https://3v4l.org/mklML
    kungfuchicken
        23
    kungfuchicken  
       2016-03-09 17:27:53 +08:00
    我在 Mac 上测试 PHP ( mac port 安装)是可以匹配到“人”的,但是在 Cent OS 上测试了几个版本的 PHP (编译安装和 yum 安装都有,跟 Mac 版本相同)都是匹配不到的

    这个不是 PHP 的锅,而是 PCRE 库的配置导致,\w 的匹配官方文档是这么说的

    A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w.

    也就是说, PCRE 库的 character tables 配置会影响到\w 的匹配
    yaxin
        24
    yaxin  
       2016-03-09 18:38:39 +08:00
    @Strikeactor 什么编辑器,这么好
    Strikeactor
        25
    Strikeactor  
       2016-03-09 18:51:51 +08:00
    yaxin
        26
    yaxin  
       2016-03-09 19:10:26 +08:00
    @Strikeactor 谢谢,不错的编辑器,而且也不贵
    ming2281
        27
    ming2281  
       2016-03-09 19:44:44 +08:00   ❤️ 1
    js 支持的正则元素不完整(指流行的 Perl 风格)
    flynaj
        28
    flynaj  
       2016-03-10 14:15:37 +08:00
    EmEditor \w 可以匹配中文,
    使用 Boost library Regex++ 的正则表达式惯例
    https://zh-cn.emeditor.com/help/howto/search/search_regexp_syntax.htm
    yumijie
        29
    yumijie  
       2016-03-10 15:04:17 +08:00
    编码的问题好像楼主没考虑

    22 楼的网友考虑了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2737 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.