Вопрос

Я пытаюсь создать класс парсера 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 это недопустимо для имени переменной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top