前往顾页
以后地位: 主页 > 收集编程 > Php实例教程 >

正向预搜刮和反向预搜刮的学习

时候:2015-03-14 21:23来源:知行网www.zhixing123.cn 编辑:麦田守望者

在看正则的时候中碰到一个如许的正则问题.
将 一句SQL语句中的“select”和“from” 之间的字符替代为 “count(*)”
问题很简朴,我的答案是

代 码:
<?php
$sql = "select uid,sas,fd from asdf";
echo preg_replace("/select(.+?)from/i",'select count(*) from',$sql);
?>


但是看了他人的答案却十分的简朴

代码:
echo preg_replace("/(?<=select).+?(?=from)/i",' count(*) ',$sql);


此中的?<=让我很不解.从质料上查获得:

代码:
(?<=select).+?(?=from)表示的是婚配从select开端到from结束中间的数据.

 

正向预搜刮:"(?=xxxxx)","(?!xxxxx)"
反向预搜刮:"(?<=xxxxx)","(?<!xxxxx)"
正向预搜刮:"(?=xxxxx)","(?!xxxxx)"

格局:"(?=xxxxx)",在被婚配的字符串中,它对所处的 "裂缝" 或 "两端" 附加的前提是:地点裂缝的右边,必须可以或许婚配上 xxxxx 这部分的表达式。因为它只是在此作为这个裂缝上附加的前提,所以它其实不影响后边的表达式去真正婚配这个裂缝以后的字符。这就近似 "\b",本身不婚配任何字符。"\b" 只是将地点裂缝之前、以后的字符取来进行了一下判定,不会影响后边的表达式来实在的婚配。

举例1:表达式 "Windows (?=NT|XP)" 在婚配 "Windows 98, Windows NT, Windows 2000" 时,将只婚配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被婚配。


举例2:表达式 "(\w)((?=\1\1\1)(\1))+" 在婚配字符串 "aaa ffffff 999999999" 时,将可以婚配6个"f"的前4个,可以婚配9个"9"的前7个。这个表达式可以读解成:反复4次以上的字母数字,则婚配其剩下最后2位之前的部分。当 然,这个表达式可以不如许写,在此的目标是作为演示之用。

格局:"(?!xxxxx)",地点裂缝的右边,必须不克不及婚配 xxxxx 这部分表达式。
举例3:表达式 "((?!\bstop\b).)+" 在婚配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一向婚配到 "stop" 之前的地位,如果字符串中没有 "stop",则婚配全部字符串。
举例4:表达式 "do(?!\w)" 在婚配字符串 "done, do, dog" 时,只能婚配 "do"。在本条举例中,"do" 后边利用 "(?!\w)" 和利用 "\b" 结果是一样的。

反向预搜刮:"(?<=xxxxx)","(?<!xxxxx)"

这两种格局的观点和正向预搜刮是近似的,反向预搜刮请求的前提是:地点裂缝的 "左边",两种格局别离请求必须可以或许婚配和必须不克不及够婚配指定表达式,而不是去判定右边。与 "正向预搜刮" 一样的是:它们都是对地点裂缝的一种附加前提,本身都不婚配任何字符。
举例5:表达式 "(?<=\d{4})\d+(?=\d{4})" 在婚配 "1234567890123456" 时,将婚配除前4个数字和后4个数字以外的中间8个数字。

------分开线----------------------------
标签(Tag):正向预搜刮 反向预搜刮
------分开线----------------------------
保举内容
猜你感兴趣