Pergunta

Eu estou tentando fazer uma classe parser bbcode que podem criar tags personalyzed, mas eu tenho algum problema com URLs

Já fez tudo necessidade I sem problemas particulares graças a expressões regulares, mas eu tenho um problema quando eu tento criar uma tag especial que apontam para um URL especificado.

Na minha classe eu adicionei um método como este:

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

O código fina trabalha com urls clássica [url] http://ciao.com [/ url] & [url = http://ciao.com] ciao [/ url]

mas eu tenho algum problema com o caso de uma página especial url assunto como estilo last.fm, então [artista] Lemon Jelly [/ artista].

O bblink é convertido em Lemon Jelly (eu usei os espaços apenas para mostrar o código de link).
O link tem os espaços em branco no atributo href assim não pode nunca mais trabalho.

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

Para evitar isso, eu escrevi uma pequena parte do código que a mudança da parte href url com tha mesma url mas com "+" no lugar de "" char espaços em branco, de modo [artista] Lemon Jelly [/ artista] devem se tornou Lemon Jelly

Eu não sou experiente com PHP e eu não sei o que é o problema, eu tenho utiliza esta sintaxe em outra situação, sem encontrar o problema.

alguém pode me ajudar a encontrar onde eu estou errado?

o tipo de erro é erro PHP Parse: erro de sintaxe, T_LNUMBER inesperado, esperando T_VARIABLE ou '$' na /...

Foi útil?

Solução

O erro de análise é devido ao fato de que $1 não é um nome de variável PHP válido. Eles devem começar com uma letra ou um sublinhado. A variável $1 povoada nos parâmetros preg_replace são apenas válido dentro dos parâmetros.

Tente algo mais parecido com isto:

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

O modificador e avalia a cadeia de substituição como código PHP, de modo que deve gerar a seqüência que você deseja.

Note, eu não posso testá-lo agora, então você pode precisar ajustá-lo um pouco. Desculpe:]
Editar Não importa que, eu tenho um porão de um cliente FTP. Corrigido o regex. Ele funciona:)

Outras dicas

Por favor, forneça o 2-3 linhas antes e depois da linha que tem o erro (número da linha deve estar no erro PHP de análise.

Esta não soa como um problema de regex ... mais como uma questão de escapar.

Eu sou um pouco novo para SO, por que não eu só comentou com a pergunta a fazer isso (como o que eu escrevi não é realmente uma resposta)

Para evitar isso, eu escrevi um pequeno parte do código que mudar a url href parte com tha mesma url mas com "+" no lugar de " "

Por que não usar urlencode sobre o conteúdo da tag?

Note que urlencode só deve ser usado para parâmetros de consulta; componentes diretório real deve usar rawurlencode , como HTTP em si não faz uso + em vez de espaços.

Eu acredito que o problema é com a referência $ 1, que é usado na função str_replace fora dos argumentos preg_replace. Os US $ 1 backreference só funciona dentro dos limites de argumentos preg_replace, então você não pode passá-lo como uma variável para str_replace; ele tenta usar $ 1 como uma variável, mas em PHP que é inválido para um nome de variável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top