曲径通幽论坛

标题: 模式修正符 [打印本页]

作者: beyes    时间: 2012-5-21 17:03
标题: 模式修正符
模式修正符号在正则表达式界定符之外使用,比如 /groad/i 中的 i 就是修正符,它表示不区分大小写。模式修正符可以调整正则表达式的解释,扩展正则表达式在匹配,替换等操作时的某些功能。可以将多个修正符号组合使用以增强正则表达式的能力。下标是一些常用的修正符号说明:
修正符功能描述
i不区分大小写
s模式中的圆点元字符"."将匹配所有字符,包括换行符。
x模式中的空白忽略不计,除非它已经被转义
e只用在 preg_replace() 函数中,在替换字符串中对你想引用做正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
m
将字符串视为多行,默认的正则开始 "^" 和 结束 "$" 将目标字符串作为单一的一“行”字符(甚至其中包含有换行符也是如此)。如果在修饰符中加上 "m",那么开始和结束将会指字符串的每一行,每一行的开头就是 "^",结尾就是 "$" 。
U
贪婪模式,最大限度匹配
D
模式中的美元元字符仅匹配目标字符串的结尾。没有该选项的话,如果最后一个字符是换行符的话,没有符号也会匹配匹配此字符之前。如果设定了该修正符那么忽略此选项。


示例一
[PHP] 纯文本查看 复制代码
<?php
    $url = "Groad.Net";
   
    preg_match("/groad. net/ix", $url, $myarray);
   
    echo "$myarray[0]";
?>

运行输出:
Groad.Net
上面使用 i 修正符忽略了大小写以及使用 x 修正符忽略了匹配模式中的空白符,因此最后能够匹配 Gorad.Net 这个字符串。

示例二
[PHP] 纯文本查看 复制代码
<?php

    $url = "Have you read the article on information information revolution";
   
    preg_match("/article.+?information/", $url, $myarray);
   
    echo "$myarray[0]";
?>

运行输出:
article on information
注意,上面使用的 .+? 本身是一种非贪婪形式(.+ 后面有一个问号 ?)。如果将正则中的问号去掉,即将 “.+?" 写成 ".+" ,那么它就是贪婪形式,那么会输出:
article on information information
但是,使用贪婪形式时,我们可以写成:
[Plain Text] 纯文本查看 复制代码
/article.+?information/U

这样也会输出 article on information information 。这是因为,我们使用了 U 这个修正符,它正是要进行贪婪修正的,即可以将一个不贪婪的人变成一个贪得无厌的人。
(正则中贪婪和非贪婪的概念可参考:http://www.groad.net/bbs/read.php?tid=4913)

示例三
[PHP] 纯文本查看 复制代码
<?php

    $url = "This\nis\na good website";
   
    preg_match("/^is/", $url, $myarray);
   
    echo "$myarray[0]";
?>

上面代码输出为空。如果将匹配模式 /^is/ 改为 /^is/m ,即后面添加了修正符 m ,那么代码输出为 is 。这是因为,被测字符串中有两个换行符(\n),如果不用 m 时,那么就只认为从第一个 ^ 开始到最后的 $ 就算是一行(中间包含换行符也是如此),而用 m 之后,则 \nis 就中的 is 就会认为是新起一行的行首,因此输出为 is 。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2