php 正则表达式详解

来源:互联网 发布:怪物猎人武器排行 知乎 编辑:程序博客网 时间:2024/04/28 16:30

      其实正则表达式没有其实挺简单的,首先给出两个列东西,可以大致看一下,稍后详解。在方括号[]外面字符含义\转意字符^在字符串开始处匹配$在字符串结尾处匹配()子模式.匹配除回车外的所有字符*重复0次或者更多+重复1次或者更多{}{min,max}最小,最大?标记一个子模式为可选在方括号里面字符含义\转意字符^非,仅用在开始处-指明字符范围        开始通过实例解释下:

        第一个例子:邮箱格式

           在开发中,常常要用到判断一个邮箱地址是否正确,那么必须先写出邮箱的正则表达式才行。一般邮箱是(数字,字母,点,下划线,中划线)@(数字,字母,中划线(注意,第一个不能为中划线)这个结论可能有错,但不影响下面的分析).(字母)

          那么它的正则表达式就可以写成:^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z0-9]+$

          ^ $作用可以理解为,将证字符串拿过来比较,从开头比较到结尾。

          [a-zA-Z0-9_\.\-]中 a-z表示从a到z的所有字母,同理,A-Z 0-9作用一样,再加下划线,中划线,点:_123dfaf_.,dfaouf_24234-都符合。

注意了,如果你只写了上面这个表达式,代表什么?就是只匹配一个字母,所以要写[a-zA-Z0-9_\.\-]+这样才能匹配多个,+是重复一次或者多次,至少一次。

直接到后面([a-zA-Z0-9][a-zA-Z0-9\-]*\.)表示上面,由于第一个不能为中划线,所以[a-zA-Z0-9]如此写,有因为已经匹配过一个字母或数字了,理论上可以了,所以用[a-zA-Z0-9\-]*重复0次或多次。

        另一个例子:日期

         ([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})

      主要想讲一下{1,2}作用([0-9]{1,2})表示,期间的字符串最少可以1位,最大可以使用2位。

      我想问已经讲的差不多了,但是应该有很多不足,如果想了解更多,可以留言,一般晚上会解答。或者QQ:356342556 2012-05-24至2012-09-01基本在线,之后由于要复习,所以白天基本不在线。

     大家一起交流。

      下面的网址是2012-07-23才找到了,因为我的文章还有不详细之处,下面的这网址介绍的很全面,强烈推荐

         http://deerchao.net/tutorials/regex/regex.htm

        

         一下内容更新与2012-08-01:关于正则表达式中 /i /is /isU的解释

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

常用集合:

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

     1)a-zA-Z_0-9    //常见字符;
    2)(abc)(skd)    //单元符合,括号内的元素会看做是一个内容;
    3)[abcd][^abd]  //原子表,^表示排除或者相反的内容;^:ctrl符;
    4)转义字符:
       \d:    [0-9];
       \D:    [^0-9];
       \w:    [a-zA-Z_0-9];常见字符匹配;
       \W:    [^a-zA-Z_0-9];非常见字符;
       \s:    空格、回车、制表符;


*  匹配前一个内容0次,一次或者多次;
  .  匹配内容的0次1次或多次,除了回车、换行以外的任意字符;(.*):任何字符;
  +  匹配前一个内容1次或者多次;
  ? 匹配前一个内容的0次或者1次;
  |  选择匹配;(前面和后面内容当成整体操作)
  ^  匹配字符串首部内容;
  $  匹配字符串尾部内容;
  \b 匹配单词边界,边界可以是空格或者特殊符号;
  \B 匹配除带单词边界以外的内容;
  {m}匹配前面内容重复M次;
  {m,}匹配前面内容重复次数大于m次;
  {m,n}匹配前面内容重复次数在于m、n之间;
  ()合并整体匹配,放入内存,可使用\1\2依次获取;
  $mode='/go*gle/';*前面的o是当做匹配的作用符处理的,而不作为数据的显示;
  $mode='/\bis\b/';is前后都有分隔符;
  $mode='/p{5,}/';匹配5次以上;

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。 
\d 匹配一个数字字符。等价于[0-9]。 
\D 匹配一个非数字字符。等价于[^0-9]。 
\f 匹配一个换页符。等价于\x0c和\cL。 
\n 匹配一个换行符。等价于\x0a和\cJ。 
\r 匹配一个回车符。等价于\x0d和\cM。 
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。 
\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。 
\t 匹配一个制表符。等价于\x09和\cI。 
\v 匹配一个垂直制表符。等价于\x0b和\cK。 
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。 
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。 
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04”&“1”。正則表达式中可以使用ASCII编码。. 
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。 
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 
\nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(?)。 


i 匹配大小写

s 模式中的圆点元字符(.)匹配所有的字符,包括换行符

x 模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两 头,也都被忽略

A (PCRE_ANCHORED) 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配即自动在模式开头加上^。

D (PCRE_DOLLAR_ENDONLY) 如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。 S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。  

U (PCRE_UNGREEDY) 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符来启用此选项。

X (PCRE_EXTRA) 此 修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将 来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。即:贪婪模式,最 大限度匹配 如:/a[\w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abce u (PCRE_UTF8) 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

应用:

define("AAPTTOOL","c:/apktool/aapt");//aapt工具的路径define("UNZIP","E:/GnuWin32/bin/unzip.exe");//试了试winrar等,没成功,就用了unzip,而linux有自带这个的function getApkIcon($apk_file,$save_path){    $aapt = AAPTTOOL;//aapt工具的路径exec("{$aapt} d badging {$apk_file}",$out,$return);//从apk中解除信息    if($return == 0){$str_out = implode("\n", $out);//分离信息}    $pattern_icon = "/icon='(.+)'/isU";//提取icon信息preg_match($pattern_icon, $str_out,$m);$info['icon']= $m[1];if($info['icon']){$command = UNZIP." -o -j {$apk_file} {$info['icon']} -d $save_path";exec($command);//解压}}     getApkIcon("//192.168.1.156/temp/test.apk","c:/tmp/");

注意:windows里面的换行是 回车+换行;

所以用

$str_out = implode("\n", $out);//分离信息
分离所得的信息。

$pattern_icon = "/icon='(.+)'/isU";//提取icon信息
中‘i’是不区分大小写;s 模式中的圆点元字符(.)匹配所有的字符,包括换行符。

/name='(.+)'/is
将会正则出,所有重复替换成所有的文字。也就是说替换出icon='ffjaljfljda'fafaf 'lfjljaljfl'所有的字符

但这不是我们想要的,我们只要icon='fdafalfj',所以用U就是说就结束了,也就是实现最短的匹配,匹配完了就结束了。

preg_match($pattern_icon, $str_out,$m);$info['icon']= $m[1];
中的
$info['icon']= $m[1];
是因为$m[0]放的是整个匹配的字符,$m[1]中放的是第一个正则表达式中第一个括号内的匹配内容,以此类推。

本次只有一个括号,所以只有$m[0]和$m[2]。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


原创粉丝点击