Intereting Posts
Как направить уведомление от клиента отдыха для целей тестирования Как легко создать форму входа в систему HTTPS? Как добавить параметры запроса в помощнике просмотра URL-адреса ZF2 / ZF3 Как устранить разрыв строки из функции fgets в PHP? Как подготовить существующую базу данных для поиска местоположения? Извлечение HTML-атрибутов в PHP с регулярным выражением libxml htmlParseDocument игнорирует флаги htmlParseOption CURSOR в proc, который только блокирует текущую строку UPDATEd (в то время как UPDATING), и ничего больше для продолжительности? определить и heredoc Как добавить лишние пробелы в PHP? PHP + MySql + Хранимые процедуры, как мне получить доступ к «вне»? Лучший способ кэширования результатов запросов, которые изменяются нечасто как заменить определенную строку в текстовом файле с помощью php? Создание и сохранение XML-файла на сервере с использованием PHP Передача переменных в XSLT

Regex приводит к тому, что «Разделитель не должен быть буквенно-цифровым или обратным слэшем»

У меня есть этот код

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