Pregunta

Estoy tratando de hacer una clase de BBCode parser que puede crear etiquetas personalyzed, pero tengo algún problema con las URL

He hecho todo lo que necesito sin problema en particular gracias a las expresiones regulares, pero tengo un problema cuando intento crear una etiqueta especial que apunta a una URL especificada.

En mi clase He añadido un 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);
    }
?>

el código funciona bien con las direcciones URL clásicos [url] http://ciao.com [/ url] y [url = http://ciao.com] Ciao [/ url]

pero tengo algún problema con el caso de una página especial url sujeto como estilo de last.fm, por lo [artista] Lemon Jelly [/ artista].

El bblink se convierte en Lemon Jelly (He utilizado los espacios sólo para mostrar el código de enlace).
El enlace tiene los espacios en blanco en el atributo href por lo que no puede nunca funcionan.

<?
    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 esto, he escrito una pequeña parte del código que cambie la parte URL href con tha misma URL pero con "+" en lugar de "" char los espacios en blanco, por lo que [artista] Lemon Jelly [/ artista] debe convirtió Lemon Jelly

No tengo experiencia con PHP y no estoy seguro de cuál es el problema, no tengo utiliza esta sintaxis en otra situación sin encontrar el problema.

alguien me puede ayudar a encontrar dónde estoy equivocado?

el tipo de error es error de PHP de análisis: error de sintaxis, T_LNUMBER inesperada, esperando T_VARIABLE o '$' en /...

¿Fue útil?

Solución

El error de análisis se debe al hecho de que $1 no es un nombre de variable PHP válida. Ellos deben comenzar con una letra o un guión bajo. La variable $1 poblado en los parámetros preg_replace son sólo válidas dentro de los parámetros.

Trate algo más parecido a esto:

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

El modificador e evalúa la cadena de reemplazo como código PHP, por lo que debería generar la cadena que desea.

Tenga en cuenta, no puedo probarlo ahora mismo, así que puede que tenga que ajustar un poco. Lo sentimos:]
Editar No importa que, me dieron una bodega de un cliente FTP. Fija la expresión regular. Funciona:)

Otros consejos

Por favor proporcionar los 2-3 líneas antes y después de la línea que tiene el error (número de línea debe estar en el error PHP de análisis.

Esto no suena como un problema de expresiones regulares ... más como un problema de escapar.

Soy bastante nuevo en SO, por qué no podría simplemente comentó a la pregunta para hacer esto (como lo que he escrito no es realmente una respuesta)

  

Para evitar esto, he escrito un poco   parte del código que cambiar la URL href   porción con tha misma URL pero con "+"   en lugar de " "

¿Por qué no usar urlencode en el contenido de la etiqueta?

Tenga en cuenta que urlencode sólo se debe utilizar para los parámetros de consulta; componentes de directorio reales deben usar rawurlencode , como HTTP en sí no utiliza + en lugar de espacios.

Creo que el problema es con la referencia de $ 1, que se utiliza en la función str_replace fuera de los argumentos preg_replace. La referencia inversa $ 1 solamente funciona dentro de los límites de los argumentos preg_replace, por lo que no puede pasar como una variable para str_replace; intenta utilizar $ 1 como una variable, pero en PHP que no es válido para un nombre de variable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top