У меня есть этот код
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>
вместо этого, но это дает ту же ошибку.
Что мне не хватает? Как правильно использовать разделители?
вы должны поместить разделители шаблонов в начале и в конце шаблона, например:
$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);