PHP正则表达式学习(一) 模式修正符

1.i (PCRE_CASELESS) :如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。

/**
*result:
Array
(
)
*/
$str = 'AbbbEEs';
$matches = array();
preg_match('/eE/', $str$matches);
print_r($matches);

/**
*result:
Array
(
  [0] => EE
)
*/
$str = 'AbbbEEs';
$matches = array();
preg_match('/ee/i', $str$matches);
print_r($matches);

2.m (PCRE_MULTILINE):默认情况下,PCRE认为目标字符串是由单行字符组成的(然而实际上他可能由多行),“行首”元字符(^)进匹配字符串的开始位置,而“行末”元字符($)仅匹配字符串末尾,或者最后的换行符(除非设置D修饰符)。这个行为和perl相同。当这个修饰符设置以后,“行首”和“行末”就会匹配目标字符串中任意换行符之后或者之前,还分别匹配目标字符串的最开始和最末尾位置。这等同于perl的/m修饰符。如果目标字符串中没有\n字符,或者模式中没有出现^或$,设置这个修饰符不产生任何影响。

$str = '<p>paragraph1</p>
<p>paragraph2</p>
<p>paragraph3</p>
';
$matches = array();
preg_match_all('/^<p>.*?<\/p>\r$/m', $str$matches);//在windows系统中要加\r,因为敲回车输入的是\r\n, 在linux下测试去掉\r
print_r($matches);

/**

*结果输出:

Array

(
    [0] => Array
        (
            [0] => <p>paragraph1</p>
            [1] => <p>paragraph2</p>
            [2] => <p>paragraph3</p>
        )
)

*/ 

3.D(PCRE_DOLLAR_ENDONLY):如果设置这个修饰符,模式中的元字符美元符号($)仅仅匹配字符串的末尾。如果没有设置这个修饰符,当字符串以一个换行符结尾时,美元符号($)还会匹配该换行符(但不会匹配之前的任何换行符). 如果设置了修饰符m, D修饰符不起作用。在perl中没有与此修饰符相同效果的修饰符。

/**
*********在windows系统中要加\r,因为敲回车输入的是\r\n, 在linux下测试请去掉\r**********
*/

/**
**未设置修饰符D时, $会匹配字符串末尾的换行符
*retult:
Array
(
  [0] => <p>paragraph3</p>
)
*/
$str = '<p>paragraph3</p>
';
$match = array();
preg_match('/<p>.*?<\/p>\r$/', $str$matches);
print_r($matches);

/**
**设置修饰符D时, $不会匹配字符串末尾的换行符
*retult:
Array
(
)
*/
$str = '<p>paragraph3</p>
';
$match = array();
preg_match('/<p>.*?<\/p>\r$/D', $str$matches);
print_r($matches);

/**

**设置修饰符D时, $不会匹配字符串末尾的换行符, 需要指明换行符
*retult:
Array
(
    [0] => <p>paragraph3</p>

)
*/
$str = '<p>paragraph3</p>
';
$match = array();
preg_match('/<p>.*?<\/p>\r\n$/D', $str$matches);
print_r($matches);

4.s(PCRE_DOTALL):默认情况下元字符(.)是匹配除换行符(\n)的所有字符,当设置了这个修饰符后,元字符(.)匹配包括换行符的所有字符。

/**
*不设置s时,不能匹配换行符
*result:
Array
(
    [0] => sfs
)
*/
$str = 'sfsdf
sfdsa';
$matches = array();
preg_match('/sf.*s/', $str$matches);
print_r($matches);


/**
*设置s后,能匹配换行符
*result:
Array
(
    [0] => sfsdf
sfds
)
*/
$str = 'sfsdf
sfdsa';
$matches = array();
preg_match('/sf.*s/s', $str$matches);
print_r($matches);

5.U(PCRE_UNGREEDY):这个修饰符扭转了量词的贪婪模式,使量词默认为费贪婪的。通过在量词后紧跟?可以使其成为非贪婪的。

/**
*量词*默认为贪婪模式
*result:
Array
(
    [0] => <p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>
)
*/
$str = '<p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>';
$matches = array();
preg_match('/<p>.*<\/p>/', $str$matches);
print_r($matches);

/**
*修饰符U扭转量词的贪婪模式
*result:
Array
(
    [0] => <p>paragraph1</p>
)
*/
$str = '<p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>';
$matches = array();
preg_match('/<p>.*<\/p>/U', $str$matches);
print_r($matches);

/**
*量词后紧跟?变为非贪婪模式
*result:
Array
(
    [0] => <p>paragraph1</p>
)
*/
$str = '<p>paragraph1</p><p>paragraph2</p><p>paragraph3</p>';
$matches = array();
preg_match('/<p>.*?<\/p>/', $str$matches);
print_r($matches);

6.e(PCRE_REPLACE_EVAL):如果设置了这个修饰符,preg_replace在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php代码评估之行(eval函数方式), 并使用之行结果 作为实际参与替换的字符串. 单引号, 双引号, 反斜线(\)和NULL字符在 后向引用替换时会被用反斜线转义.

/**
*result:
ggggggggggoooo
*/
$str = 'goooo';
echo preg_replace('/(g)/e', 'str_repeat(\\1, 10)', $str);

 

7.S:当一个模式需要多次使用的时候, 为了得到匹配速度的提升, 值得花费一些时间 对其进行一些额外的分析. 如果设置了这个修饰符, 这个额外的分析就会执行. 当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符). 

 

8.A(PCRE_ANCHORED):如果设置了这个修饰符, 模式被强制为"锚定"模式, 也就是说约束匹配使其仅从 目标字符串的开始位置搜索. 这个效果同样可以使用适当的模式构造出来, 并且 这也是perl种实现这种模式的唯一途径. 

 

9. x (PCRE_EXTENDED):如果设置了这个修饰符, 模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略. 这个修饰符 等同于perl中的/x修饰符, 使被编译模式中可以包含注释. 注意: 这仅用于数据字符. 空白字符 还是不能在模式的特殊字符序列中出现, 比如序列(?(引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误. 比如( ?(就会导致错误.). 

 

10.X (PCRE_EXTRA):这个修饰符打开了PCRE与perl不兼容的附件功能. 模式中的任意反斜线后就ingen一个 没有特殊含义的字符都会导致一个错误, 以此保留这些字符以保证向后兼容性. 默认 情况下, 在perl中, 反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文. 当前没有其他特性由这个修饰符控制.  

posted @ 2012-09-26 18:01  Mr雨寒  阅读(449)  评论(0编辑  收藏  举报