zoukankan      html  css  js  c++  java
  • php正则贪婪匹配与非贪婪匹配一些例子

    http://www.111cn.net/phper/210/55600.htm

    贪婪模式匹配的原则是:

    在可匹配也可不匹配的情况下, 优先匹配,直到不能匹配成功的情况下,记录备选状态,并把匹配控制交给正则表达式的下一个匹配字符,当之后的匹配失败的时候,再回溯,进行匹配。
    它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所以说它是贪婪的。

    举例说明:

    preg_match 函数会返回第一个匹配的字符串。
    现在有下面字符串

     代码如下 复制代码
    $str= "Nothing can <b>replace</b> a <b>mother</b>'s love."

    现在想要获取第一个<b>replace</b>的内容。

    1.贪婪匹配

     代码如下 复制代码

    <?php 
    $str= "Nothing can <b>replace</b> a <b>mother</b>'s love."; 
      
    // 贪婪匹配返回最大的字符串 
    $IsMatch= preg_match('/<b>(.*)</b>/', $str, $match); 
    if( $IsMatch ){ 
      print_r($match) . "n" ; 

    /* 
    输出: 
    Array 

        
    [0] => <b>replace</b> a <b>mother</b> 
        
    [1] => replace</b> a <b>mother 

    */
    ?>

    没有得到想要的内容。贪婪匹配返回最大的字符串。

    非贪婪匹配


    “?”当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

    例:

     代码如下 复制代码

    preg_replace('/<td (.*?)>/i','<td>',$str);//匹配“<td”后出现的第一个“>”;

    preg_replace('/<td (.*)>/i','<td>',$str);//匹配“<td”后出现的最后一个“>”;


    preg_replace('/<td (.*?)>/i','<td>',$str);//匹配“<td”后出现的第一个“>”;也等效于preg_replace('/<td (.*)>/isU','<td>',$str);

    另外:用$1,$2……$9可以提取()中的值。


    具体方法有两种使用修饰符U或者是?。

     代码如下 复制代码

    <?php 
    $str= "Nothing can <b>replace</b> a <b>mother</b>'s love."; 
      
    // 使用?非贪婪匹配返回最小的字符串 
    $IsMatch= preg_match('/<b>(.*?)</b>/', $str, $match); 
    if( $IsMatch ){ 
      print_r($match) . "n" ; 

    /* 
    输出: 
    Array 

        
    [0] => <b>replace</b> 
        
    [1] => replace 

    */
      
    ?>

    再看

     代码如下 复制代码


    <?php 
    $str= "Nothing can <b>replace</b> a <b>mother</b>'s love."; 
      
    // 使用U非贪婪匹配返回最小的字符串 
    $IsMatch= preg_match('/<b>(.*)</b>/U', $str, $match); 
    if( $IsMatch ){ 
      print_r($match) . "n" ; 

    /* 
    输出: 
    Array 

        
    [0] => <b>replace</b> 
        
    [1] => replace 

    */
      
    ?>

    非贪婪匹配得到了想要的结果

    比如下面这个例子:

    字符串:....src="http://www.111cn.net /1.mp3" type="application/x-mplayer2" .... 
    要求的结果:http://www.111cn.net /1.mp3

    如果匹配表达式写为:/src="(.*)"/,则得不到正确的结果,因为最后一个双引号的匹配是贪婪模式的。

    解决办法:匹配表达式写为:

     代码如下 复制代码
    /src="(.*)".?/

    上面表达式中,".?是非贪婪模式匹配。也就是说,只要在一个字符后面跟上限定个数的特殊字符,匹配就是非贪婪模式了。

    php汉字正则验证表达式详解

    最近几天,一直在为汉字验证的事纠结.百度了,google了,尼玛,找到的全是[u4e00-u9fa5]+$.这个是不对的,我怎么验证都不行,而且.这样验证只能是在utf8编码的情况下.在试了N天果后,今晚在baidu换了关键词终于找到了正确的正则表达式.以 后在网上分享东西..还是要验证过才能说啊.不能这样坑爹啊.

    好了,主角上场."/^[x{4e00}-x{9fa5}]+$/u",就是他了,拿了直接用.哈哈.给力.给个例子吧,

     代码如下 复制代码

    $str = "坑爹的汉字验证";

    if (preg_match("/^[x{4e00}-x{9fa5}]+$/u",$str))
    {
        echo '123';

    }
     else
     {
           echo 'bbb';    
     }

    运行结果,你懂的,但在gbk下上面会影响汉字判断的准确性了,

    接着gg找到一段代码

     代码如下 复制代码

    echo (mb_eregi("[x80-xff].","中d文") ? "有" : "无") ."汉字";
    echo (mb_eregi("^([x80-xff].)+$","中文") ? "全是汉字" : "");


     代码如下 复制代码

    <?php
    $str = '汉字3测试';
    if (preg_match("/([x81-xfe][x40-xfe])/", $str, $match)) {
    echo '含有汉字'; 
    } else {
    echo '不含有汉字';
    }
    ?>

    当$str = '汉字3测试'; 时输出"含有汉字";
    当$str = 'abc345'; 时输出"不含有汉字";

    下面的例子包含gbk,gb2312的用法,需要的可以取消gbk那行的注释,然后把utf-8的注释掉

     代码如下 复制代码

    <?php
    $action = trim($_GET['action']);
    if($action == "sub")
    {
        $str = $_POST['dir'];    
        //if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312汉字字母数字下划线正则表达式 
        if(!preg_match("/^[x{4e00}-x{9fa5}A-Za-z0-9_]+$/u",$str))   //UTF-8汉字字母数字下划线正则表达式
        {   
            echo "<font color=red>您输入的[".$str."]含有违法字符</font>";   
        }
        else 
        {
            echo "<font color=green>您输入的[".$str."]完全合法,通过!</font>";   
        }
    }
    ?>
    <form method="POST" action="?action=sub">
    输入字符(数字,字母,汉字,下划线):
        <input type="text" name="dir" value="">
        <input type="submit" value="提交">
    </form>

  • 相关阅读:
    遍历路径下的所有文件
    房间安排(题目168)
    创建BitMap
    字母统计(241)
    DataTable的Select方法
    ArcEngine中Feature对象的Shape属性和ShapeCopy属性
    C# 轻松获取路径中文件名、目录、扩展名等
    TreeList获取节点中的值
    【算法】LeetCode算法题-Two Sum
    JSP(一):初识JSP
  • 原文地址:https://www.cnblogs.com/jukan/p/5707376.html
Copyright © 2011-2022 走看看