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>

php正则贪婪匹配与非贪婪匹配一些例子的更多相关文章

  1. Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配

    Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配 //贪婪匹配 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   ...

  2. JS正则表达式从入门到入土(6)—— 贪婪模式与非贪婪模式

    贪婪模式 之前说了正则的量词,但是量词会带来一个到底该匹配哪个的问题. 如下正则表达式: \d{3,6} 这个正则表达式是匹配3到6个数字,但是当这个正则表达式被用来匹配12345678这个字符串,到 ...

  3. 第11.9节 Python正则表达式的贪婪模式和非贪婪模式

    在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "*". " ...

  4. re 正则匹配的非贪婪匹配

    非贪婪匹配 将尽可能少的匹配内容,当?出现在其他的重复次数后面时会将贪婪模式改为非贪婪模式. ? 如 abc.*? abc.+? 非贪婪匹配:尽可能少的匹配{n,}?{,n}?{n,m}?*? # * ...

  5. PHP正则 贪婪匹配与非贪婪匹配

    $str = ".abcdeabcde"; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0] =& ...

  6. python 正则表达式与JSON-正则表达式匹配数字、非数字、字符、非字符、贪婪模式、非贪婪模式、匹配次数指定等

    1.正则表达式:目的是为了爬虫,是爬虫利器. 正则表达式是用来做字符串匹配的,比如检测是不是电话.是不是email.是不是ip地址之类的 2.JSON:外部数据交流的主流格式. 3.正则表达式的使用 ...

  7. shell 中 贪婪匹配 和 非贪婪匹配

    举个栗子: v=jfedu.shiyiwen.com echo ${v%.*} 一个%为非贪婪匹配,即匹配最短结果.%从右到左进行非贪婪匹配,匹配什么呢? 匹配已 .*的字符. 那么当然是匹配到了.c ...

  8. JavaScript 正则表达式——预定义类,边界,量词,贪婪模式,非贪婪模式,分组,前瞻

    ㈠预定义类    示例:匹配一个ab+数字+任意字符的字符串:ab\d.   ㈡边界 正则表达式常用的边界匹配字符   ⑴示例1:第一个是没写单词边界             第二个是加上字符边界的效 ...

  9. java 正则表达式获取匹配和非获取匹配

    package test1; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestExp ...

随机推荐

  1. 你可能没听过的 Java 8 中的 10 个特性

    你以前听到的谈论关于Java8的所有都是围绕lambda表达式. 但它仅仅是Java8的一部分. Java 8 有许多新特性—一些强大的新类和语法, 还有其他的从一开始就应该具有的东西. 我将要介绍我 ...

  2. Spark生态之SparkR

  3. [iOS基础控件 - 4.3] APP列表 xib的使用

    A.storyboard和xib 1.storyboard: 相对xib较重量级,控制整个应用的所有界面 2.xib: 轻量级,一般用来描述局部界面   B.使用 1.新建xib文件 New File ...

  4. [Objective-c 基础 - 2.5] .h和.m文件,点语法,成员变量作用域

    A. 命令行编译和XCode编译 1.在存在多个.m源码实现文件的情况下,若根据需要引入.m文件,使用命令行仅仅编译主.m文件即可,但是XCode会同时编译全部.m文件,会发生编译错误(重复定义全局变 ...

  5. MyBatis如何防止SQL注入

    转自:http://www.myexception.cn/sql/1938757.html SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转 ...

  6. 【Stage3D学习笔记续】真正的3D世界(二):显示模型

    虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告 ...

  7. mac不可或缺的套件管理器Homebrew

    Homebrew 1.简介 可以帮助我们快速安装软件, 如 brew install svn 快速卸载软件 , 如  brew uninstall svn 2.下载 打开终端, /usr/bin/ru ...

  8. cocos2d-x NotificationCenter

    转自:http://www.xinze.me/cocos2d-x-ccnotificationcenter/ 在前端开发中,JS和as3中都有很好的监听机制, 我们使用Event的addEventLi ...

  9. Android在线更新 远程安装程序

    原文:http://blog.csdn.net/jasper_success/article/details/7984065 第一步:使用java.net的URLConnection对象来创建连接 第 ...

  10. MSSQL计算日期方法大全

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函 ...