不理解php preg_replace中的正则表达式

时间:2013-06-28 19:32:55

标签: php regex preg-replace pipe

一个非常基本的问题,我在下面的正则表达式中没有得到Pipe的用法:

$menu=preg_replace("|<li><a href=\"".$base."\">(.*)</a></li>|U", "<li class=\"current\">$1</li>", $menu);  

当然我知道它们意味着多个(OR)匹配,我不知道为什么在那个位置使用,就像在正则表达式的最开头一样“|

http://www.paitadesign.com/blog/php-e-css-come-evidenziare-la-pagina-corrente-nel-menu-di-navigazione/

如果你能提供帮助,我会很高兴,我确信这是一个愚蠢的问题!

3 个答案:

答案 0 :(得分:2)

管道是分隔符,从修饰符中分离出正则表达式(通常你会看到/作为分隔符,但它可以是任何单个字符)http://php.net/manual/en/regexp.reference.delimiters.php

http://php.net/manual/en/reference.pcre.pattern.modifiers.php 在那里查找U修饰符,即PCRE_UNGREEDY

答案 1 :(得分:1)

字母U是用于对模式匹配行为进行修改的修饰符。

我 - 忽略大小写,不区分大小写

U - 不确定地搜索

s - 包含新行

m - 多行

x - 扩展了评论和空白

e - 支持将替换评估为PHP代码。 (仅限preg_replace)

S - 模式的额外分析

详见:

http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html

答案 2 :(得分:1)

正如Kris解释的那样,管道用作分隔符,U修饰符用于在贪婪和懒惰之间切换量词行为。

请注意,此行可以更好地编写如下:

$menu = preg_replace('~<li><a href="' . $base . '">(.*?)</a></li>~',
                     '<li class="current">$1</li>', $menu);