[正则入门]请教一下正则表达式与通配符的区别 ,贪婪模式和最少模式的示例

jackxiang 2012-8-10 22:49 | |
贪婪模式和最少模式:


*贪婪模式:
#php ee.php
Array
(
    [0] => <h2>hello</h2><h2>world</h2>
    [1] => hello</h2><h2>world
)


?问号的贪婪模式:
#php ee.php
Array
(
    [0] => <h2>hello</h2>
    [1] => hello
)




PHP的交互模式实践如下:


本人小新手,最近在看vbird的私房菜,在看chapter11和12时有个小疑问:
在两章中分别介绍了通配符和正则表达式的用法,两者在表达上存在差别,比如通配符用(*)表示任意多个字符,正则表达式则用(.)等等,
那么请问大家,两者使用的场合是怎么区别的呢,是根据命令的不同还是正则表达式只用于字符串的搜索匹配呢。


通配符是用来通配的
正则表达式是用来匹配字符串的
在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的。
而通配符多用在文件名上,比如查找find,ls,cp,等等。
这是我个人的一些看法,不知道对不对。

感觉通配符是系统level的

正则表达式需要相关工具的支持: egrep, awk, vi, perl。。

来源:http://bbs.chinaunix.net/thread-1255137-1-1.html
务必参考:http://blog.csdn.net/whxlovehy/article/details/6052366

如把Html里的脚本给去掉,怎么匹配,正确匹配如下:

如果没有问号,这样:<script[^>].*>  ,你会发现这个> 给匹配到最后一个>了,因为是贪婪匹配,所以得加上:? ,后面一个也是一样的,
这里面有一个.*? ,这个?就是最小模式,如果说没有这个?,那么?让它去匹配:
<script type="text/javascript"></script></script> ,就会把最后的一个重复的</script>匹配上,因为是最大长度模式匹配,(第二个用的贪婪匹配),为此,这个?号作用可大了。
上面表达式中,".?是非贪婪模式匹配。也就是说,只要在一个字符后面跟上限定个数的特殊字符,匹配就是非贪婪模式了。

最终Ok的匹配且成功的结果:

结果如下:
<html><head>.</head><css></css></html>
用RegexBuddy测试好后,Copy,Copy regex as,copy regex as "//"  preg string:  '%<script[^>].*?>.*?</script>%' 后修改为:

$str='%<script[^>].*?>.*?</script>%';  经测试,也是Ok的,这儿这个小工具帮我们规避掉下面文章所说的问题了。但它默认还是以//,这儿特殊它给我们规避,变为:%罢了,呵呵。
------------------------------------------------来自:http://hi.baidu.com/yglht/item/632a3dabf8a1cc9a15107300  ------------------------
遇到的问题:PHP正则preg_replace()函数 Unknown modifier 'c'问题
今天想用PHP正则去掉字符串中的JavaScript脚本,于是用了preg_replace()函数尝试。
PHP代码如下:
<?php
function ReplaceScript(&$txt)
{
      $str="/<script[^>]*?>.*?</script>/si":
     //[^>]*?表示匹配任意次除">"以外任意字符,但尽可能少重复
//.*? 表示匹配任意次任意字符
     preg_replace("$str","",$txt);
}
$txt="<script language='javascript'> var preFrameW = '160,*'; </script>";
$txt.="hello world";
echo $txt;
ReplaceScript($txt);
echo   $txt;
?>
预想结果为 连续两次输出 hello world,且查看html源代码时只有第一次会输出JavaScript代码。
但结果如下:
hello world
Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ~~~

hello world
除了这个问题很纠结外,打开html看其源代码,依然有两次JavaScript代码输出。说明JavaScript代码并没有被取代为空格。
后面经过几次修改函数中的$str变量,依次出现了 Warning: preg_replace() [function.preg-replace]: Unknown modifier '/' in ~~~ 等稀奇八怪的提示。JavaScript代码也依旧没有被替换
郁闷啊,于是又改回到最初的函数,找出PHP5帮助文档,查看preg_replace() 说明。修改ReplaceScript()函数为
function ReplaceScript(&$txt)
{
      $str="/<script[^>]*?>.*?</script>/si":
      print preg_replace("$str","",$txt);
}
结果是输出了三次JavaScript代码,看来还是$str问题。于是乎,奈着性子看了大量的例子。觉得没有错啊,一般匹配字符都是这么写,开始结尾均有个" / "。但是这个时候,其实我并不知道这个 /   有什么作用。呵呵,还是觉得没有错。只好百度之,在百度里看到了例外,有人居然不是用 " / "放在开头结尾,而是用 " ' "字符代替。莫非PHP默认这个字符 / 的用处仅仅就是帮助PHP界定匹配字符串的区间,在这个区间外就不匹配。而实际只要用另外的一个字符分别放在匹配字符串的开头和结尾也可以达到同样的目的。于是果断把$str换为     $str="' <script[^>]*?>.*?</script>' ": 编译again 。
呵呵,万能的神,Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ~~~这个问题终于没有了。查看生成的htm源代码,输出了三次helloworld,输出了两次JavaScript(用print函数输出的没有)。看来是识别成功了,只是$txt没有替换。于是再次修改
function ReplaceScript(&$txt)
{
      $str="' <script[^>]*?>.*?</script>'si ":
      print $txt=preg_replace("$str","",$txt);
}
查看结果,这次是输出了三次helloworld,只在第一次输出helloworld前输出了JavaScript,后面两次都被替换掉了。呵呵,OK,问题搞定。
总结,我犯的错误在     $str="/<script[^>]*?>.*?</script>/si":   这里面的</script>已经有一个" / "了,所以开头的 " / "就和这个 " / "形成了匹配区间,而把这个" / "之后的" script>/ " 当成了模式修正符。但实际模式修正符只有i,m,s,x,e等少数几个,而"script>/ "里面的c,r,p,> ,/ 都不是模式修正符,所以才出了Unknown modifier 'c‘   Unknown modifier '/ ’ 等问题 (没有出现 Unknown modifier 's‘ ,是因为 s 是模式匹配符啊)。
模式修正符号可以参考学习:http://hi.baidu.com/longniao/blog/item/b2af346d658ea9f3431694db.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/5483/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2018-11-13 14:31
评论列表
2012-9-1 01:16 | hxngb5mf Email Homepage
謝謝分享哦。
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]