2013-08-25 34 views
0

我有这样的代码正则表达式的结果“分隔符不能是字母,数字或反斜线”

function a($menu_item, $remove_link) { 
    $pattern = 'class="(.+)"(.+)<a.+>(.+)</a>'; 
    if($remove_link) { 
     return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item); //<- line 6 
    } 
    return $menu_item; 
} 

这基本上检查,如果$remove_link是真实的,然后删除该链接并增加了一个类定义$menu_item

例如,如果我使用

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>'; 
$menu_item = a($menu_item, true); 

它应该返回

<li class="menuitem first selected">Home</li>; 

正则表达式进行测试,它工作在记事本+ +,但我的职责是给这个错误:

Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in functions.php on line 6 

我看到PHP的模式必须被“分隔”用斜杠,所以我试图用class="/(.+)"(.+)<a.+>(.+)/</a>相反,但它给出了同样的错误。

我在想什么?我如何正确使用分隔符?

+0

见http://php.net/manual/en/regexp.reference.delimiters.php – mario

回答

1

你必须把模式分隔符,在开始时,在该模式的结尾,例如:

$pattern = '#class="(.+)"(.+)<a.+>(.+)</a>#'; 

这里#/一个更好的选择,因为你避免逃避你的模式里面所有的斜线,但你可以这样写:

$pattern = '/class="(.+)"(.+)<a.+>(.+)<\/a>/'; 

顺便说一句评论,你的模式会造成许多回溯:

$pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)</a>~'; 

会更好。

请记住,+*默认情况下是贪婪的量词(即他们尽可能地)。

如果我使用受限制的字符类,而不是点的,我可以停止量词的贪婪,例如

[^"]+采取一切之外的字符",从而停止时"是找到。

演示:

<?php 
function a($menu_item, $remove_link) { 
    //$pattern = '~class="(.+)"(.+)<a.+>(.+)</a>~'; 
    $pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)<\/a>~'; 
    if($remove_link) { 
     return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item); 
    } 
    return $menu_item; 
} 

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>'; 
echo a($menu_item, true); 
+0

它消除了错误,但文本没有被替换。为什么? – BackSlash

+0

刚刚检查了您的更新,它不起作用。你的意思是你的模式是false_?你的意思是错的?我使用Notepad ++进行了检查,并且制作了一个使用相同正则表达式的小程序,它为什么不能用于PHP?附:然而,你的正则表达式不起作用。 – BackSlash

+0

@BackSlash:测试后,你的模式似乎可行,但会导致很多回溯(正则表达式引擎必须前进才能找到匹配项)。我已经用我的模式中的'*'替换了一个'+'量词(因为在这个例子中类和'''之间没有任何内容) –

相关问题