php正则表达式高级技巧及实例(Perl兼容)
闭合引号替换为1:
preg_match( ''/(\"|'').*?\1/'', $str, $matches ); 这会正确地返回字串: "This is a ''string''" 译注思考题: 如果是中文引号,前引号和后引号不是同一个字符,怎么办? 还记得PHP函数 preg_replace 吗?其中也有回返引用。只不过我们没有用 \1 … \9,而是用了 $1 … $9 … $n (此处任意数目均可)作为回返指针。例如,如果你想把所有的段落标签<p>都替换成文本: $text = preg_replace( ''/<p>(.*?)</p>/'', "<p>$1</p>", $html ); 参数$1是一个回返引用,代表段落标签<p>内部的文字,并插入到替换后的文本里。这种简便易用的表达式写法为我们提供了一个获取已匹配文字的简单方法,甚至在替换文本时也能使用。 3. 已命名捕获组(Named Groups) 当在一个表达式内多次用到回调引用时,很容易就把事情搞混淆,要弄清那些数字(1 … 9)都代表哪一个子内容是件很麻烦的事。回调引用的一个替代方法是使用带名字的捕获组(下文简称“有名组”)。有名组使用(?P<name>pattern)来设定,name代表组名,pattern是配合该有名组的正则结构。请看下面的例子: /(?P<quote>"|'').*?(?P=quote)/ 上式中,quote就是组名,"|''是改组匹配内容的正则。后面的(?P=quote)是在调用组名为quote的有名组。这个式子的效果和上面的回调引用实例一样,只不过是用了有名组来实现。是不是更加易读易懂了? 有名组也能用于处理已匹配内容之数组的内部数据。赋予特定正则的组名也能作为所匹配到的内容在数组内部的索引词。 preg_match( ''/(?P<quote>"|\'')/'', "''String''", $matches ); # 下面的语句输出“''”(不包括双引号) echo $matches[1]; # 使用组名调用,也会输出“''” echo $matches[''quote'']; 所以,有名组并不只是让写代码更容易,它也能用于组织代码。 4. 字词边界(Word Boundaries) 字词边界是字串里的字词字符(包括字母、数字和下划线,自然也包括汉字)和非字词字符之间的位置。 其特殊之处就在于,它并不匹配某个实在的字符。它的长度是零。 \b 匹配所有字词边界。 不幸的是,字词边界一般都被忽视掉了,大部分人都没有在意他的现实意义。 例如,如果你想要匹配单词“import”: /import/ 注意了!正则表达式有时候很调皮的。下面的字串也能和上面的式子匹配成功: important 你或许觉得,只要在import前后加上空格,不就可以匹配这个独立的单词了: / import / 那如果遇上这种情况呢: The trader voted for the import 当 import 这个词在字串开头或者结尾时,修改后的表达式仍然不能用。因此,考虑各种情况是必须的: /(^import | import | import$)/i 别慌,还没完呢。如果遇到标点符号了呢?就为了满足这一个单词的匹配,你的正则可能就需要这样写: /(^import(:|;|,)? | import(:|;|,)? | import(\.|\?|\!)?$)/i 对于只匹配一个单词来说,这样做实在是有点大动干戈了。正因如此,字词边界才显得意义重大。要适应上述要求,以及很多其他情况变种,有了字符边界,我们所需写的代码只是: /\bimport\b/ 上面所有情况都得到了解决。 \b 的灵活性就在于,它是一个没有长度的匹配。它只匹配两个实际字符之间想象出的位置。它检查两个相邻字符是否是一个为单字,另一个为非单字。情况符合,就返回匹配。如果遇到了单词的开头或结尾, \b 会把它当成是非单词字符对待。由于import里面的 i 仍然被看成是单词字符,import 就被匹配出来了。 注意,与\b相对,我们还有\B,此操作符匹配两个单字或者两个非单字之间的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |