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>;

正则表达式经过测试,它可以在 Notepad++ 中运行,但我的函数给出了这个错误:

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

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

我错过了什么?如何正确使用分隔符?

4

1 回答 1

1

您必须将模式分隔符放在模式的开头和结尾,例如:

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

#是一个更好的选择,/因为您避免转义模式中的所有斜线,但您可以编写:

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

顺便说一句,您的模式将导致许多回溯:

$pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)</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);
于 2013-08-25T16:14:04.360 回答