Синтаксическая ошибка PHP в методе preg_replace
-
19-09-2019 - |
Вопрос
Я пытаюсь создать класс парсера bbcode, который может создавать персонализированные теги, но у меня некоторые проблемы с URL-адресами
Я сделал все, что мне нужно, без особых проблем благодаря регулярным выражениям, но у меня возникает проблема, когда я пытаюсь создать специальный тег, который указывает на указанный URL.
В моем классе я добавил такой метод, как этот:
<?
private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
$regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
if (!isset ($css)) $css = $this->css_link;
$regex_url = $this->regex_url;
if (isset ($url_path)) $url_path = "$url_path/";
$this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$1</a>", $this->bbcode);
$this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
}
?>
код прекрасно работает с классическими URL-адресами [url]http://ciao.com [/url] & [url=http://ciao.com ]чао[/url]
но у меня есть некоторая проблема со случаем использования специального URL-адреса тематической страницы в качестве last.fm style, поэтому [исполнитель] Lemon Jelly[/ исполнитель].
bblink преобразуется в < a href="http://ciao.com/artist/Lemon Желе"> Лимонное желе< /a> (Я использовал пробелы < a> только для того, чтобы показать код ссылки).
Ссылка содержит пробелы в атрибуте href, поэтому никогда не может работать.
<?
private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
$regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
if (!isset ($css)) $css = $this->css_link;
$regex_url = $this->regex_url;
if (isset ($url_path)) $url_path = "$url_path/";
// begin of the problem
$this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path".str_replace (" ", "+", $1)."\">$1</a>", $this->bbcode);
// end of the problem
$this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
}
?>
Чтобы избежать этого, я написал небольшую часть кода, которая изменяет часть URL-адреса href на тот же URL-адрес, но с "+" вместо " " пробельного символа, так что [исполнитель]Лимонное желе[/artist] должно было стать < a href="http://ciao.com/artist/Lemon+Jelly"> Лимонное желе< /a>
У меня нет опыта работы с PHP, и я не уверен, в чем проблема, я использовал этот синтаксис в другой ситуации, не сталкиваясь с проблемой.
кто-нибудь может помочь мне найти, где я ошибаюсь?
тип ошибки - ошибка синтаксического анализа PHP:синтаксическая ошибка, неожиданный T_LNUMBER, ожидание T_VARIABLE или '$' в /...
Решение
Ошибка синтаксического анализа связана с тем, что $1
не является допустимым именем переменной PHP.Они должны начинаться с буквы или подчеркивания.Тот самый $1
переменная, заполненная в preg_replace
параметры действительны только внутри параметров.
Попробуйте что-нибудь более похожее на это:
$this->bbcode = preg_replace("/\[$tag\]([$regex_url]*)\[\/$tag\]/e", "'<a title=\"Vai al link\" class=\"$css\" href=\"$url_path'. str_replace(' ', '+', '$1'). '\">$1</a>'", $this->bbcode);
Тот самый e
modifier оценивает строку замены как PHP-код, так что это должно сгенерировать нужную вам строку.
Обратите внимание, я не могу протестировать это прямо сейчас, поэтому вам, возможно, придется немного подправить его.Извините :]
Редактировать Не обращайте на это внимания, я заполучил FTP-клиент.Исправлено регулярное выражение.Это работает :)
Другие советы
Укажите 2–3 строки до и после строки, в которой есть ошибка (номер строки должен быть указан в ошибке синтаксического анализа PHP.
Это не похоже на проблему с регулярным выражением...больше похоже на ускользающую проблему.
Я новичок в SO, почему я не мог просто прокомментировать вопрос, чтобы задать этот вопрос (поскольку то, что я написал, на самом деле не является ответом)
Чтобы избежать этого, я написал небольшую часть кода, которая изменяет URL-адрес href часть с тем же URL-адресом, но с "+" вместо " "
Почему бы не использовать urlencode
о содержимом тега?
Обратите внимание, что urlencode следует использовать только для параметров запроса;фактические компоненты каталога должны использовать rawurlencode
, поскольку сам HTTP не использует + вместо пробелов.
Я считаю, что проблема связана со ссылкой $1, которая используется в str_replace
функционировать вне preg_replace
аргументы.Обратная ссылка $1 работает только в пределах preg_replace
аргументы, поэтому вы не можете передать их как переменную в str_replace
;он пытается использовать $1 в качестве переменной, но в PHP это недопустимо для имени переменной.