zoukankan      html  css  js  c++  java
  • php 正则匹配中文(转)

    我使用正则表达式来匹配中问的时候,出现了无法匹配的问题,问题如下

     PCRE does not support L, l, N{name}, U, or u at offset 2 

    我原来的匹配公式是:

    /[u4e00-x9fa5]/

    然后我在网上找的,下面的解决方案

    解决后的匹配方案是:

    /^[x{4e00}-x{9fa5}]+$/u

    下面是具体文章

    在做表单验证时对用户姓名的验证规则有以下要求
    要求:输入的内容需要满足的条件是:
     
    1.允许输入字符:数字(0-9)、字母(a-z和A-Z)、汉字、下划线(_)、圆点(.)和空格;
    2、姓名中间允许有空格;
    3、下划线、圆点和空格均为英文状态输入法下的字符;
    4、姓名前后不允许输入下划线、圆点、空格和特殊字符
    $str = 'abc测试 ef';
    if(preg_match('/^[a-zA-Z0-9u4e00-u9fa5]+$|^[a-zA-Z0-9u4e00-u9fa5][a-zA-Z0-9_s u4e00-u9fa5.]*[a-zA-Z0-9u4e00-u9fa5]+$/',$str)){
       echo "符合验证规则";
    }else{
       echo "不符合验证规则";
    }
    执行时报错:Severity: Warning
    Message: preg_match() [function.preg-match]: Compilation failed: PCRE does not support L, l, N{name}, U, or u at offset 12
    错误的大概意思是:preg_match()[函数。):编译失败:PCRE不支持 L,L N {名称}, U,或 U在抵消12
     
      后来试了几次,发现表达式中"u4e00-u9fa5" 匹配中文时出问题了,正常情况下匹配中文是这样写的啊,所以很纳闷,于是在网上搜了搜发现在php中 不支持这样的表达式匹配中文
    网上在一篇“模式修正符”的文章中介绍到:
    u(PCRE_UTF8)
    此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。
    既然是不兼容,那php中是如何匹配到中文呢?
    仔细查了查发现php中utf-8编码下用正则表达式匹配汉字的最终正确表达式是:/^[x{4e00}-x{9fa5}]+$/u
    于是将“u4e00-u9fa5”替换成“x{4e00}-x{9fa5}”进行尝试。
    if(preg_match('/^[a-zA-Z0-9x{4e00}-x{9fa5}]+$|^[a-zA-Z0-9x{4e00}-x{9fa5}][a-zA-Z0-9_s x{4e00}-x{9fa5}.]*[a-zA-Z0-9x{4e00}-x{9fa5}]+$/u',$str)){
    echo "符合验证规则";
    }else{
    echo "不符合验证规则";
    }
    注:表达式的最后也要加上‘u’
    最后没有再报错并且正则匹配成功了。
    原文地址:
    http://blog.sina.com.cn/s/blog_8122f6b70101hifb.html
  • 相关阅读:
    java中复制图片
    java中复制图片
    java中替换文件内容
    java中替换文件内容
    java中替换文件内容
    java中复制文本文件
    mac 地址分配
    data standardization
    Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks
    算法设计 mac 字符串 标识 n维度 2 3维度 字符串 标识值 特征值
  • 原文地址:https://www.cnblogs.com/ningheshutong/p/5278423.html
Copyright © 2011-2022 走看看