正则表达式备忘录

preg_grep — 返回与模式匹配的数组单元
preg_last_error — Returns the error code of the last PCRE regex execution
preg_match_all — 进行全局正则表达式匹配
preg_match — 进行正则表达式匹配
preg_quote — 转义正则表达式字符
preg_replace_callback — 用回调函数执行正则表达式的搜索和替换
preg_replace — 执行正则表达式的搜索和替换
preg_split — 用正则表达式分割字符串

———————————————————————-
TEST:

/**
* @name regular_preg.php
* @date Mon Jun 16 19:06:28 CST 2008
* @copyright 马永占(MyZ)
* @author 马永占(MyZ)
* @link http://blog.csdn.net/mayongzhan/
*/
$a = array(’myz’,'123′,’mayongzhan’,”,’blog.csdn.net/mayongzhan’);
$b = ‘myz123mayongzhan456 myzhan84m9999 blog.csdn.net/mayongzhan’;
$c = ‘ s . + * ? [ ^ ] $ ( ) { } = ! < > | : ‘;
echo ‘a:<br />’;
print_r($a);
echo ‘<br /><br />b:<br />’.$b;
echo ‘<br /><br />c:<br />’.$c;
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_grep<br />’;
echo ‘<br /><br />$a<br />’;
echo ‘<br /><br />/^m/<br />’;
print_r(preg_grep(’/^m/’,$a));
echo ‘<br /><br />/a/<br />’;
print_r(preg_grep(’/a/’,$a));
echo ‘<br /><br />/a/ PREG_GREP_INVERT<br />’;
print_r(preg_grep(’/a/’,$a,PREG_GREP_INVERT));
echo ‘<br /><br />string<br />’;
print_r(preg_grep(’/a/’,$a,PREG_GREP_INVERT));
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_match_all<br />’;
echo ‘<br /><br />$b<br />’;
echo ‘<br /><br />/[a-z]([0-9])/ PREG_PATTERN_ORDER<br />’;
unset($match);
preg_match_all(’/[a-z]([0-9])/’,$b,$match);
print_r($match);
echo ‘<br /><br />/[a-z]([0-9])/ PREG_SET_ORDER <br />’;
unset($match);
preg_match_all(’/[a-z]([0-9])/’,$b,$match,PREG_SET_ORDER);
print_r($match);
echo ‘<br /><br />/[a-z]([0-9])/ PREG_OFFSET_CAPTURE <br />’;
unset($match);
preg_match_all(’/[a-z]([0-9])/’,$b,$match,PREG_OFFSET_CAPTURE);
print_r($match);
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_match<br />’;
echo ‘<br /><br />$b<br />’;
echo ‘<br /><br />/[0-9]([a-z])/<br />’;
unset($match);
preg_match_all(’/[0-9]([a-z])/’,$b,$match);
print_r($match);
echo ‘<br /><br />/[0-9]([a-z])/ PREG_OFFSET_CAPTURE <br />’;
unset($match);
preg_match_all(’/[0-9]([a-z])/’,$b,$match,PREG_OFFSET_CAPTURE);
print_r($match);
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_quote<br />’;
echo ‘<br /><br />$c<br />’;
echo ‘<br /><br />s<br />’;
echo $c.’<br />’;
echo preg_quote($c,’s’);
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_replace_callback<br />’;
echo ‘<br /><br />$b<br />’;
echo ‘<br /><br />/myz/<br />’;
function testF($matches)
{
return ‘a’.substr($matches[0],1);
}
echo preg_replace_callback(’/myz/’,'testF’,$b);
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_replace<br />’;
echo ‘<br /><br />$b<br />’;
echo ‘<br /><br />/myz/<br />’;
echo preg_replace(’/myz/’,'MYZ’,$b);
echo ‘<br /><br />—————————’;
echo ‘<br /><br />preg_split<br />’;
echo ‘<br /><br />$b<br />’;
echo ‘<br /><br />/myz/ limit 3<br />’;
print_r(preg_split(’/myz/’,$b,2));
echo ‘<br /><br />/myz/ PREG_SPLIT_NO_EMPTY<br />’;
print_r(preg_split(’/myz/’,$b,-1,PREG_SPLIT_NO_EMPTY));
echo ‘<br /><br />/myz/ PREG_SPLIT_NO_EMPTY<br />’;
print_r(preg_split(’/myz([0-9])/’,$b,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
echo ‘<br /><br />/myz/ PREG_SPLIT_NO_EMPTY<br />’;
print_r(preg_split(’/myz([0-9])/’,$b,-1,PREG_SPLIT_OFFSET_CAPTURE|PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
?>

———————————————————————-
array preg_grep ( string $pattern , array $input [, int $flags ] )
flags 可以是以下标记:
PREG_GREP_INVERT
如果传递入此标记,preg_grep() 会返回输入数组中不匹配给定
pattern 的单元。本标记自 PHP 4.2.0 起可用。
———————————————————————-
int preg_last_error ( void )
———————————————————————-
int preg_match_all ( string $pattern , string $subject ,
array $matches [, int $flags ] )
flags 可以是下列标记的组合(注意把 PREG_PATTERN_ORDER 和
PREG_SET_ORDER 合起来用没有意义):
PREG_PATTERN_ORDER
对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1]
为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
PREG_SET_ORDER
对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1]
为第二组匹配项的数组,以此类推。
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含
匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的
文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。
PREG_OFFSET_CAPTURE
如果设定本标记,对每个出现的匹配结果也同时返回其附属的字
符串偏移量。注意这改变了返回的数组的值,使其中的每个单元
也是一个数组,其中第一项为匹配字符串,第二项为其在
subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
如果没有给出标记,则假定为 PREG_PATTERN_ORDER。
返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
———————————————————————-
int preg_match ( string $pattern , string $subject
[, array $matches [, int $flags ]] )
flags 可以是下列标记:
PREG_OFFSET_CAPTURE
如果设定本标记,对每个出现的匹配结果也同时返回其附属的字
符串偏移量。注意这改变了返回的数组的值,使其中的每个单元
也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。
本标记自 PHP 4.3.0 起可用。
———————————————————————-
string preg_quote ( string $str [, string $delimiter ] )
如果提供了可选参数 delimiter ,该字符也将被转义。可以用
来转义 PCRE 函数所需要的定界符,最常用的定界符是斜线 /。
正则表达式的特殊字符包括:. + * ? [ ^ ] $ ( ) { } = ! < > | :
———————————————————————-
mixed preg_replace_callback ( mixed $pattern ,
callback $callback , mixed $subject [, int $limit ] )
本函数的行为几乎和 preg_replace() 一样,除了不是提供一个
replacement 参数,而是指定一个 callback 函数。该函数将以
目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。
———————————————————————-
mixed preg_replace ( mixed $pattern , mixed $replacement ,
mixed $subject [, int $limit ] )
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement 。
如果指定了 limit ,则仅替换 limit 个匹配,如果省略 limit 或
者其值为 -1,则所有的匹配项都会被替换。
replacement 可以包含 \n 形式或(自 PHP 4.0.4 起)$n 形式的
逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被
捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,
其中 \0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从
左到右计数(从 1 开始)以取得子模式的数目。
对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在
一个匹配的模式后面的数字),不能使用熟悉的 \1 符号来表示
逆向引用。举例说 \11,将会使 preg_replace() 搞不清楚是想
要一个 \1 的逆向引用后面跟着一个数字 1 还是一个 \11 的逆
向引用。本例中的解决方法是使用 ${1}1。这会形成一个隔离的
$1 逆向引用,而使另一个 1 只是单纯的文字。
———————————————————————-
array preg_split ( string $pattern , string $subject
[, int $limit [, int $flags ]] )
返回一个数组,包含 subject 中沿着与 pattern 匹配的边
界所分割的子串。
如果指定了 limit ,则最多返回 limit 个子串,如果 limit
是 -1,则意味着没有限制,可以用来继续指定可选参数 flags 。
flags 可以是下列标记的任意组合(用按位或运算符 | 组合):
PREG_SPLIT_NO_EMPTY
如果设定了本标记,则 preg_split() 只返回非空的成分。
PREG_SPLIT_DELIM_CAPTURE
如果设定了本标记,定界符模式中的括号表达式也会被捕获
并返回。本标记添加于 PHP 4.0.5。
PREG_SPLIT_OFFSET_CAPTURE
如果设定了本标记,如果设定本标记,对每个出现的匹配结果
也同时返回其附属的字符串偏移量。注意这改变了返回的数组
的值,使其中的每个单元也是一个数组,其中第一项为匹配字
符串,第二项为其在 subject 中的偏移量。
本标记自 PHP 4.3.0 起可用。
———————————————————————-

实例大全 内容摘自regularlab
表达式 “dd”,在匹配 “abc123″ 时,匹配的结果是:
成功;匹配到的内容是:”12″;
匹配到的位置是:开始于3,结束于5。
表达式 “a.d”,在匹配 “aaa100″ 时,匹配的结果是:
成功;匹配到的内容是:”aa1″;
匹配到的位置是:开始于1,结束于4。
表达式 “[bcd][bcd]” 匹配 “abc123″ 时,匹配的结果是:
成功;匹配到的内容是:”bc”;
匹配到的位置是:开始于1,结束于3。
表达式 “[^abc]” 匹配 “abc123″ 时,匹配的结果是:
成功;匹配到的内容是:”1″;
匹配到的位置是:开始于3,结束于4。
表达式 “d+.?d*” 在匹配 “It costs $12.5″ 时,
匹配的结果是:成功;匹配到的内容是:”12.5″;
匹配到的位置是:开始于10,结束于14。
表达式 “go{2,8}gle” 在匹配 “Ads by goooooogle” 时,
匹配的结果是:成功;匹配到的内容是:”goooooogle”;
匹配到的位置是:开始于7,结束于17。
表达式 “^aaa” 在匹配 “xxx aaa xxx” 时,匹配结果是:
失败。因为 “^” 要求与字符串开始的地方匹配,
因此,只有当 “aaa” 位于字符串的开头的时候,”^aaa”
才能匹配,比如:”aaa xxx xxx”。
表达式 “aaa$” 在匹配 “xxx aaa xxx” 时,匹配结果是:
失败。因为 “$” 要求与字符串结束的地方匹配,因此,
只有当 “aaa” 位于字符串的结尾的时候,
”aaa$” 才能匹配,比如:”xxx xxx aaa”。
表达式 “.b.” 在匹配 “@@@abc” 时,匹配结果是:成功;
匹配到的内容是:”@a”;
匹配到的位置是:开始于2,结束于4。
进一步说明:”b” 与 “^” 和 “$” 类似,
本身不匹配任何字符,但是它要求它在匹配结果中所处
位置的左右两边,其中一边是 “w” 范围,
另一边是 非”w” 的范围。
表达式 “bendb” 在匹配 “weekend,endfor,end” 时,

匹配结果是:成功;匹配到的内容是:”end”;匹配到的位置
是:开始于15,结束于18。
表达式 “Tom|Jack” 在匹配字符串 “I’m Tom, he is Jack”
时,匹配结果是:成功;匹配到的内容是:”Tom”;匹配到的
位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;
匹配到的内容是:”Jack”;
匹配到的位置时:开始于15,结束于19。
表达式 “(gos*)+” 在匹配 “Let’s go go go!” 时,
匹配结果是:成功;匹配到内容是:”go go go”;
匹配到的位置是:开始于6,结束于14。
表达式 “¥(d+.?d*)” 在匹配 “$10.9,¥20.5″ 时,
匹配的结果是:成功;匹配到的内容是:”¥20.5″;
匹配到的位置是:开始于6,结束于10。
单独获取括号范围匹配到的内容是:”20.5″。
表达式 “<td>(.*)</td>” 与字符串
“<td><p>aa</p></td> <td><p>bb</p></td>” 匹配时,
匹配的结果是:成功;
匹配到的内容是 “<td><p>aa</p></td> <td><p>bb</p></td>”
整个字符串, 表达式中的 “</td>” 将与字符串中最后一个
“</td>” 匹配。
相比之下,表达式 “<td>(.*?)</td>” 匹配举例1中同样的字
符串时,将只得到 “<td><p>aa</p></td>”, 再次匹配下一个
时,可以得到第二个 “<td><p>bb</p></td>”。
表达式 “(’|”)(.*?)(1)”
在匹配 ” ‘Hello’, “World” ” 时,匹配结果是:成功;
匹配到的内容是:” ‘Hello’ “。再次匹配下一个时,
可以匹配到 ” “World” “。
表达式 “(w)1{4,}”
在匹配 “aa bbbb abcdefg ccccc 111121111 999999999″ 时,
匹配结果是:成功;匹配到的内容是 “ccccc”。
再次匹配下一个时,将得到 999999999。这个表达式要求 “w”
范围的字符至少重复5次,注意与 “w{5,}” 之间的区别。
表达式 “<(w+)s*(w+(=(’|”).*?4)?s*)*>.*?</1>” 在匹配
“<td id=’td1′ style=”bgcolor:white”></td>” 时,
匹配结果是成功。如果 “<td>” 与 “</td>” 不配对,
则会匹配失败;如果改成其他配对,也可以匹配成功。
表达式 “Windows (?=NT|XP)”
在匹配 “Windows 98, Windows NT, Windows 2000″ 时,
将只匹配 “Windows NT” 中的 “Windows “,
其他的 “Windows ” 字样则不被匹配。
表达式 “(w)((?=111)(1))+” 在匹配字符串
“aaa ffffff 999999999″ 时,将可以匹配6个”f”的前4个,
可以匹配9个”9″的前7个。这个表达式可以读解成:重复4次
以上的字母数字,则匹配其剩下最后2位之前的部分。当然,
这个表达式可以不这样写,在此的目的是作为演示之用。
表达式 “((?!bstopb).)+” 在匹配
“fdjka ljfdl stop fjdsla fdj” 时,将从头一直匹配到
“stop” 之前的位置,如果字符串中没有 “stop”,
则匹配整个字符串。
表达式 “do(?!w)” 在匹配字符串 “done, do, dog” 时,
只能匹配 “do”。在本条举例中,”do” 后边使用 “(?!w)”
和使用 “b” 效果是一样的。
表达式 “(?<=d{4})d+(?=d{4})” 在匹配
“1234567890123456″ 时,将匹配除了前4个数字和后4个
数字之外的中间8个数字。
表达式 “(?:(w)1)+” 匹配 “a bbccdd efg” 时,结果
是 “bbccdd”。括号 “(?:)” 范围的匹配结果不进行记录
,因此 “(w)” 使用 “1″ 来引用。
———————————————————
模式修正符 内容摘自php手册
i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。
m(PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符
所组成的(甚至其中包含有换行符也是如此)。“行起始”
元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)
仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面
(除非设定了 D 修正符)。这和 Perl 是一样的。当设定了
此修正符,“行起始”和“行结束”除了匹配整个字符串开头
和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl
的 /m 修正符是等效的。如果目标字符串中没有“n”字符或
者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的
字符,包括换行符。没有此设定的话,则不包括换行符。这和
Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配
换行符的,无论是否设定了此修正符。
x(PCRE_EXTENDED)
如果设定了此修正符,模式中的空白字符除了被转义的或在字
符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下
一个换行符之间的所有字符,包括两头,也都被忽略。这和
Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加
入注释。然而注意,这仅适用于数据字符。空白字符可能永
远不会出现于模式中的特殊字符序列,例如引入条件子模式
的序列 (?( 中间。
e
如果设定了此修正符,preg_replace() 在替换字符串中对
逆向引用作正常的替换,将其作为 PHP 代码求值,并用其
结果来替换所搜索的字符串。
只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
Note: 本修正符在 PHP3 中不可用。
A(PCRE_ANCHORED)
如果设定了此修正符,模式被强制为“anchored”,即强制
仅从目标字符串的开头开始匹配。此效果也可以通过适当的
模式本身来实现(在 Perl 中实现的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果设定了此修正符,模式中的美元元字符仅匹配目标字符
串的结尾。没有此选项时,如果最后一个字符是换行符的话,
美元符号也会匹配此字符之前(但不会匹配任何其它换行符
之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有
与其等价的修正符。
S
当一个模式将被使用若干次时,为加速匹配起见值得先对其
进行分析。如果设定了此修正符则会进行额外的分析。目前,
分析一个模式仅对没有单一固定起始字符的 non-anchored
模式有用。
U(PCRE_UNGREEDY)
本修正符反转了匹配数量的值使其不是默认的重复,而变成
在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以
通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个
问号(如 .*?)来启用此选项。
X(PCRE_EXTRA)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。
模式中的任何反斜线后面跟上一个没有特殊意义的字母导致
一个错误,从而保留此组合以备将来扩充。默认情况下,和
Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被
当成该字母本身。当前没有其它特性受此修正符控制。
u(PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。
模式字符串被当成 UTF-8。本修正符在 Unix 下自
PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。
自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。
———————————————————
元字符
有数种用途的通用转义符
^
断言目标的开头(或在多行模式下行的开头,
即紧随一换行符之后)
$
断言目标的结尾(或在多行模式下行的结尾,
即紧随一换行符之前)
.
匹配除了换行符外的任意一个字符(默认情况下)
[
字符类定义开始
]
字符类定义结束
|
开始一个多选一的分支
(
子模式开始
)
子模式结束
?
扩展 ( 的含义,也是 0 或 1 数量限定符,以及数量
限定符最小值 ? 等同于 {0,1}
*
匹配 0 个或多个的数量限定符 * 等同于 {0,}
+
匹配 1 个或多个的数量限定符 + 等同于 {1,}
{
最少/最多数量限定开始 {0,1}
}
最少/最多数量限定结束 {3,9}
———————————————————
模式[]内 元字符,以[开始
通用转义字符
^
排除字符类,但仅当其为第一个字符时有效

指出字符范围
]
结束字符类
———————————————————
d
任一十进制数字
D
任一非十进制数的字符
s
任一空白字符
S
任一非空白字符
w
任一“字”的字符
W
任一“非字”的字符
b
字分界线
B
非字分界线
A
目标的开头(独立于多行模式)
Z
目标的结尾或位于结尾的换行符前(独立于多行模式)
z
目标的结尾(独立于多行模式)
G
目标中的第一个匹配位置
a
alarm,即 BEL 字符(0×07)
cx
“control-x”,其中 x 是任意字符
e
escape(0×1B)
f
换页符 formfeed(0×0C)
n
换行符 newline(0×0A)
r
回车符 carriage return(0×0D)
t
制表符 tab(0×09)
xhh
十六进制代码为 hh 的字符
ddd
八进制代码为 ddd 的字符,或 backreference
40
另一种表示空格的方法
40
同上,如果之前捕获的子模式少于 40 个的话
7
总是一个逆向引用
11
可能是个逆向引用,或者是制表符 tab
11
总是表示制表符 tab
113
表示制表符 tab 后面跟着一个字符“3”
113
表示八进制代码为 113 的字符(因为不能超过 99
个逆向引用)
377
表示一个所有的比特都是 1 的字节
81
要么是一个逆向引用,要么是一个二进制的零后面
跟着两个字符“8”和“1”
p{xx}
具有 xx 属性的一个字符
P{xx}
没有 xx 属性的一个字符
X
一个扩展 Unicode 序列
以上三个使用的 Unicode 字符属性
C Other – 其它
Cc Control – 控制
Cf Format – 格式
Cn Unassigned – 无符号
Co Private use – 私有
Cs Surrogate – 代替
L Letter -字母
Ll Lower case letter – 小写字母
Lm Modifier letter – 修正符字母
Lo Other letter – 其它字母
Lt Title case letter – 标题大写字母
Lu Upper case letter – 大写字母
M Mark – 标记
Mc Spacing mark – 空格标记
Me Enclosing mark – 环绕标记
Mn Non-spacing mark – 非空格标记
N Number – 数字
Nd Decimal number – 十进制数字
Nl Letter number – 字母数字
No Other number – 其它数字
P Punctuation – 标点符号
Pc Connector punctuation – 连接标点符
Pd Dash punctuation – 横线标点符
Pe Close punctuation – 结束标点符
Pf Final punctuation – 最终标点符
Pi Initial punctuation – 起始标点符
Po Other punctuation – 其它标点符号
Ps Open punctuation – 开始标点符
S Symbol – 符号
Sc Currency symbol – 货币符号
Sk Modifier symbol – 修正符号
Sm Mathematical symbol – 算术符号
So Other symbol – 其它符号
Z Separator – 分隔符
Zl Line separator – 行分隔符
Zp Paragraph separator – 段落分隔符
Zs Space separator – 空格分隔符
———————————————————
内部选项设定
i 代表 PCRE_CASELESS
m 代表 PCRE_MULTILINE
s 代表 PCRE_DOTALL
x 代表 PCRE_EXTENDED
U 代表 PCRE_UNGREEDY
X 代表 PCRE_EXTRA
/ab(?i)c/ 只匹配 “abc” 和 and “abC”
———————————————————
转自:http://blog.csdn.net/mayongzhan – 马永占

发表评论

邮箱地址不会被公开。 必填项已用*标注