我有这个代码
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>;
regex经过测试,可以在Notepad++中工作,但我的函数给出了以下错误:
Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in functions.php on line 6
我看到php模式必须用斜杠"分隔",所以我尝试使用class="/(.+)"(.+)<a.+>(.+)/</a>
,但它给出了相同的错误。
我错过了什么?如何正确使用分隔符?
您必须在模式的开始和结束处放置模式分隔符,例如:
$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);