lampabc.com,lamp学习本应更简单, 互帮 互助 共享 ~~~

PHP正则表达式

正则表达式是一种可以用于模式匹配和替换的强有力的工具。


    正则表达式格式 : 正则表达式一般用两个“/”定界符定界的,当然也可以不用。

    元字符: 就是指那些在正则表达式中具有特殊意义的专用字符

    限定符:

    “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,

    “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,

    “?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。当放在限定符后表示懒惰匹配(匹配尽可以少的字符)。默认是贪婪匹配。当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符。

      “|”管道符,表示“或”:如"ab|cd"同时匹配"ab"和"cd"而不匹配"abcd"   
  “( )”表示一或多个字符,从前往后,圆括号中的匹配字符串依次以$1,……$9,……返回:如"(bi(ng)z)hu(o)"中,$1代表"bi(ng)z",$2代表"ng",$3代表"o"
  “[ ]”中可有多个字符,但只表示其中一个:如"[xyx]"匹配"x","y","z"但不匹配"xyz",等同于"x|y|z";另,"[abcde]"这种连续字符可简写为"[a-e]","[abcde12345]"可简写为"[a-e1-5]"
  “[^ ]”表示除括号内字符以外的单个字符:如"[^xyz]"匹配"w","a"而不匹配"x","y";"[^abcde]"亦可简写为"[^a-e]". 一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
  “{n}”n为一数字,表示前接字符重复次数:如"a{3}"表示"aaa"
  “{n,}”表示前接字符至少重复n次:如"a{3,}"匹配"aaa"和"aaaaa"而不匹配"aa"
  “{n,m}”表示前接字符至少重复n次,至多重复m次   
  “”为转义字符,后接上述特殊字符时表示该字符:如"?"表示"?","["表示"["

    转义符:

    s:用于匹配单个空格符,包括tab键和换行符;
    S:用于匹配除单个空格符之外的所有字符;
    d:用于匹配从0到9的数字;

    D:用于匹配与/d不匹配的字符;
    w:用于匹配字母,数字或下划线字符;
    W:用于匹配所有与/w不匹配的字符;
     . :用于匹配除换行符之外的所有字符。

    :用于匹配制表符。等价于/x09和/cl

    定位符: 除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。
较为常用的定位符包括: “^”, “$”, “/b” 以及 “/B”。其中,

     “^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,

    定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,

    “B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“/b”和“/B”看作是互为逆运算的两组定位符。举例来说:
/^hell/
因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。
/ar$/
因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。
//bbom/
因为上述正则表达式模式以“/b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。
/man/b/
因为上述正则表达式模式以“/b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。

    修饰符: 在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着 "e "并不等于 "E ")。

     i   :如果在修饰符中加上 "i ",则正则将会取消大小写敏感性,即 "a "和 "A "   是一样的。  
     m:默认的正则开始 "^ "和结束 "$ "只是对于正则字符串如果在修饰符中加上 "m ",那么开始和结束将会指字符串的每一行:每一行的开头就是 "^ ",结尾就是 "$ "。  
    s:如果在修饰符中加入 "s ",那么默认的 ". "代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!  
    x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。  
    e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。  
    A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说 "/a/A "匹配 "abcd "。  
    E:与 "m "相反,如果使用这个修饰符,那么 "$ "将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。  
    U:和问号的作用差不多,用于设置 "贪婪模式 "。

    字符簇:

    [[:alpha:]] 任何字母
    [[:digit:]] 任何数字
    [[:alnum:]] 任何字母和数字
    [[:space:]] 任何白字符
    [[:upper:]] 任何大写字母
    [[:lower:]] 任何小写字母
    [[:punct:]] 任何标点符号
    [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

   各种操作符的优先级:

 

操作符描述
/转义符
(), (?:), (?=), []圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, /anymetacharacter位置和顺序
|“或”操作

 

例子:

//替换m变量为p
$string = ' m._form item.abcdfe:m.fun();abc+m.str';
$pattern = '/([^a-zA-Z])m./'; // '/([^a-zA-Z])m./';也行
$replacement = '$1p.'; //就不知道为什么改成 '${1}p.';不行
print preg_replace($pattern, $replacement, $string);
echo '
';
//$后接数字如$1的使用,贪婪匹配模式
$string = "April 15, 2003 May 1, 2012-------";
$pattern = "/(w+ )(d+), (d+)/";
$replacement = "${1},$2";
print preg_replace($pattern, $replacement, $string);
echo '
';

匹配邮箱:

$pattern = '/^[0-9a-zA-Z]+@[0-9a-zA-Z]+[.][a-z]{2,4}$/';
$re = preg_match($pattern, $string);
var_dump($re);


PHP内置的一些替换功能的函数:

string strip_tags ( string$str [,string$allowable_tags ] )

$text '

Test paragraph.

 Other text';
echo 
strip_tags($text);
echo 
"";

// Allow 

 and 

echo strip_tags($text'

'

);


上例将输出:

Test paragraph. Other textTest paragraph. Other text