原文地址:http://blog.csdn.net/mu_rain/article/details/5435745



1 正则是什么.
请先看 http://www.PHPchina.com/html/11/n-34811.html 几k 的解释后.

原地址已被更改,重新找了一个教程,请点击。 http://deerchao.net/tutorials/regex/regex.htm 2 实例剖析. 1. $str = '<FORM&NBSP;NAME="ADFA"&NBSP;ACTION="ASDF.BPHP"&NBSP;TARGET=""><FORM&NBSP;NAME="BBBB"&NBSP;ACTION="HTTP: www.bac.com test.PHP? target="qwerqwerq"><FORM&NBSP;NAME="BBBB"&NBSP;ACTION="HTTP.PHP"&NBSP;TARGET="QWERQWERQ">'; 2. $match = ''; 3. preg_match_all('//s+action=/"(?!http:)(.*?)/"/s/',$str,$match); 4. print_r($match); //s+action=/"(?!http:)(.*?)/"/s/ 此正则是用来匹配 action=”xxx” 里面的xxx的. 可讲的地方有3 1 /”(.*?)/” 会匹配 aa”abb”aaaa” 字符串中的”abb”” 而(.*)/” 则会去匹配aa”abb”aaaa”中的”abb”aaaa”. 此谓之贪婪(greedy) 特别实用。U 修正符可以反转正则式中的贪婪。 2 (?!http:) 代表将要匹配的内容中不含有http: 他本身不匹配内容. 例如 我要匹配一个 长为8-16里面不能有http 的字符串,就写 (?!http)/w{8-16} 即可。 3 就是这哥们匹配时,定死了action=” 后面的这个(“) 如果是 ‘ 号呢怎么办呢? 这里就要用到 反向引用了。 相关正则表达式如下。 (?<=/s*action=('|/"))(?!|http)(.*?)(?=/1) 演化一下 最初的想法 Action=/”(.*)/” => 为能只匹配 action=”dddd” fdsfds” 中的action=”dddd”而不是action=”dddd” fdsfds” 更改为action=/”(.*?)/” =>要支持单引号action=(‘/”)(.*?)/1 => action 后面引号内不允许有http action=(‘/”)(?!http:)(.*?)/1 => 只想提取引号内的内容,不想提取其它的内容. (?<=/s*action=('|/"))(?!http)(.*?)(?=/1) 文中还有两个例子挺实用的。 带断言的正则匹配 1. $match = ''; 2. $str = '<A&NBSP;HREF="">xxxxxx.com.cn <b>ddddbolod</b>paragraph text '; 3. preg_match_all ( '/(?<=<(/w{1})>).*(?=<///1>)/',$match ); 4. echo "<BR&NBSP; />匹配没有属性的标签中的内容:"; 5. print_r ( $match ); 正则式为(?<=<(/w{1})>).*(?=<///1>) (?<=<(/w{1})>) 为逆向预匹配,就是说需要匹配的左边要满足这要求。 上PHP手册查了一下,preg_match_all("/(<([/w]+)[^>]*>)(.*?)(<////2>)/",$html,$matches,PREG_SET_ORDER); 然后表大式可以更改为(?<=<(/w+)>).*(?=<///1>) 替换HTML源码中的地址 1. $form_html = preg_replace ( '/(?<=/saction=/"|/ssrc=/"|/shref=/")(?!http:|javascript)(.*?)(?=/"/s)/e','add_url(/$url,/'//1/')',$form_html ); 这个也是单双引号的问题,需要改改. 2 看完帖http://www.PHPchina.com/html/03/n-34203.html 觉得 function is_good_pw($pw) { if(preg_match('/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}/',$pw)) { return true; } return false; } 可以吸收一下。下面我决定啰哩啰嗦的解试一下这个函数。 .{8-16} 代表匹配8-16位非换行字符串。 可是当我们需要这8-16 位的数字中,必须有数字,而且有小写字母,而且有大写字母时,正则表达式如何去写呢? (?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16} 匹配 必须有数字,小写字母,大写之母的 的8-16 位的字符. 1 基础概念讲解. 1 理解缝隙的概念. 例如,"^","$","/b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件 2 ?=xxx) 正向预搜索 代表缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式 那么 (?=.*[/d]).{8-16} 代表匹配含有数字的8-16位的字符串, 如果是(?=/d).{8-16}则匹配的内容为首位为数字的8-16 的字符串. 如果是(?=/d{2}).{8-16}则匹配的内容为前两位为数字的8-16 的字符串. 从这里看来,正向预搜索需要理解的就是(?=xxx) 本身是不匹配字符的,而是给右侧的字符串添加条件,目的就是要右侧的字符串能满足这个预搜索条件。 .{8-16} 代表任意非换行的8 位字符串. (?=.*[/d]).{8-16} 代表任意非换行的8-16 位字符串,而且这8-16位字符串中有数字。 (?=.*[/d]) (?=.*[a-z]).{8-16}代表任意非换行的8-16 位字符串,而且这8-16位字符串中有数字,而且这8-16位字符串中有a-z 之间的字母. 这样看来(?=.*[/d]).{8-16}的(?=.*[/d])就是用来向.{8-16}来叠加规则的.*[/d] 的 (?=.*[a-z]) (?=.*[/d]).{8-16} 中的(?=.*[a-z])就是用来向(?=.*[/d]).{8-16}叠加(?=.*[a-z])规则。 这样下来,当我们需要匹配的8-16位中间有数字而且有大写字母而且有小写字母,的时修就用到了(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16} 此时,我们能匹配8-16 位的数字中,必须有数字,而且有小写字母,而且有大写字母 这时,如果要被匹配的字符串中不能出现 http 这时怎么处理呢? 答案很简单 加个正向否定预搜索就可以了 (?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?!http).{8,16} 下一个实例,货币替换. 1 理清思路,货币替换对正则而言就是要找那些 距离结尾或[.] 隔着/d{3}+ 的/d 所以一开始就是(/d)(?=(/d{3})+($|/./d*)) 如果不希望回代后面的值,就用(/d)(?=(?:/d{3})+(?:$|/./d*)) 再补点预搜索条件(?=/d)(?!/./d*) 是数字,而且不能以 .开头 最后就拼接成了. (?<!/./d*)(?=/d)(/d)(?=(?:/d{3})+(?:$|/./d*)) 附PHP代码. <?PHP $money_arr = array( "0","12","123","1234","12345","123456","1234567","123456789","1234567890","12.345","123.456","1234.56","12345.6789","123456.789","1234567.89","12345678.9","sdsd12345678.9" ); foreach($money_arr as $key=>$val) { echo $val; $str = preg_replace("/(?=/d)(?!/./d*)(/d)(?=(?:/d{3})+($|/./d*))/","$1,",$val); echo "the replace result is";echo $str; echo "<hr/>"; } function pr($arr){ //格式化输出数组. print("<pre>");print_r($arr);print("</pre>"); } ?> 下一例: <img src=’xxx’> <img src=’xxx’ /> <img src=’xxx’ > ddd</img> 当需要抓取这三种时,第三种的前面和第一种重复,则用 ? 来解决 <img[^>]>(.*<//img>)? 即可

进一步的去了解正则[一]的更多相关文章

  1. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  2. ios – Swift:如何从不同的swift文件中调用函数

    我的Xcode6beta-2项目中有多个类型为UIViewController的swift文件.我基本上想知道文件A中的一些数据在文件B中使用.我的文件都是UIViewControllers,我创建了一个没有参数的函数,它返回UIViewController_A中的字符串.当我尝试在UIViewController_B中调用所述函数时,intellisense为我填写,但是我必须有一个自动填充为U

  3. ios – 如何使用SwiftyJSON将字符串转换为JSON

    要转换的字符串:[{“description”:“Hi”,“id”:2,“img”:“hi.png”},{“description”:“pet”,“id”:10,“img”:“pet.png“},{”description“:”Hello!:D“,”id“:12,”img“:”hello.png“}]转换字符串的代码:varjson=JSON该字符串转换为JSON,当我尝试计算这个JSON里面有多少个块时,我得到0.打印控制台输出:0我失踪了什么帮助非常感激.解决方法实际上,在SwifyJSON中有一个内

  4. ios – 将两个字符串转换为一组布尔值的快速方法是什么?

    我有一个长字符串,我想转换为一个布尔值数组.而且它需要很多次,很快.我天真的尝试是这样的:但这比我想要的要慢很多.我的剖析告诉我,地图是减速的地方,但我不知道我能做多么简单.我觉得如果没有Swift’s/ObjC的开销,这样做会很快.在C中,我认为这是一个简单的循环,其中一个字节的内存与一个常量进行比较,但我不知道我应该看的是什么函数或语法.有更好的办法吗?

  5. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 05 Strings and Characters

    Swift所代表的字符串是字符串类型,进而代表字符类型的值的集合//Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。每一个字符值代表一个Unicode字符,我们可以利用for-in循环来遍历字符串中的每一个字符println}//定义一个字符常量letyenSign:Character="$"printlncharacters")//使用"countElements()"函数来获取字符串的长度//8.ConcatenatingStrings

  6. String 与 NSString 的区别

    Swift的String类型与FoundationNsstring类进行了无缝桥接。在日常开发中,绝大多数应该用StringString与Nsstring还有以下区别String类型是值类型,字符串在进行常量、变量赋值操作或在函数/方法中传递时,会进行值拷贝。任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。String可以支持字符遍历Nsstring不支持String是一个结构体,性能更高;Nsstring是一个NSObject对象,性能相对会差现在还有一些功能,用String不

  7. 三 Swift学习之字符串和字符Strings and Characters

    Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。更多关于在Foundation和Cocoa中使用String的信息请查看UsingSwiftwithCocoaandObjective-C。Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。所以Swift中的字符在一个字符串中并不一定占用相同的内存空间。

  8. Swift语法基础:13 - Swift的字符串字面量, 初始化字符串, 字符串可变性, 字符串是值类型

    在不同情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值。Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值,其明确您独有该字符串的值,无论它来自哪里。您可以放心您传递的字符串本身不会被更改,除非是你自己更改它。

  9. Swift语法基础:14 - Swift的字符使用, 计算数量, 连接字符串和字符, 字符串插值, 比较字符串

    如果您正在处理一个长字符串,需要注意countElements函数必须遍历字符串中的字符,以精准计算字符串的长度。Nsstring的length属性是基于利用UTF-16表示的十六位codeunits数目,而不是基于Unicode字符。为了解决这个问题,Nsstring的length属性在被Swift的String值访问时会被称为utf16count。

  10. Swift教程08-基本数据类型(四)String与NSString对比

    Swift给我们提供的字符串类型String与Objc的提供的字符串Nsstring有很大的不同对比如下:(1)Objc中的字符串对应的是一个类Nsstring,是引用类型;而Swift的字符串String对应的是一种值类型.(2)形式上,Swift字符串前面不需要加上@符号(3)使用var定义的字符串则是Objc中的可变字符串;使用let定义的字符串为Objc对应的不可变字符串(4)字符串本质上

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部