我有这个代码
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
为 true,然后删除链接并添加类定义$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>
相反,但它给出了相同的错误。
我缺少什么?如何正确使用分隔符?
您必须在模式的开头和结尾放置模式分隔符,例如:
$pattern = '#class="(.+)"(.+)<a.+>(.+)</a>#';
Here #
是一个更好的选择/
因为您避免转义模式中的所有斜杠,但您可以编写:
$pattern = '/class="(.+)"(.+)<a.+>(.+)<\/a>/';
作为旁白,你的模式会导致很多回溯:
$pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)</a>~';
会工作得更好。
请记住+
and *
默认情况下是贪婪量词(即它们竭尽全力)。
如果我使用受限制的字符类而不是点,我可以停止量词的贪婪,例如
[^"]+
取除以下所有字符"
,因此当"
是找到。
Demo:
<?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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)