Domanda

Sto cercando di fare una classe bbcode parser in grado di creare i tag personalyzed, ma ho qualche problema con gli URL

Ho fatto tutto quello che serve senza particolari problemi grazie alle espressioni regolari, ma ho un problema quando cerco di creare un tag speciale che punta a un URL specificato.

Nella mia classe ho aggiunto un metodo come questo:

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

Il codice funziona bene con gli URL classici [url] http://ciao.com [/ url] & [url = http://ciao.com] Ciao [/ url]

, ma ho qualche problema con il caso di uno speciale URL della pagina soggetto come stile di last.fm, quindi [artista] Lemon Jelly [/ artist].

Il bblink viene convertito in Lemon Jelly (ho usato gli spazi solo per mostrare il codice di collegamento).
Il collegamento ha i spazi bianchi sul attributo href quindi non potrà mai funzionare.

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

Per evitare questo, ho scritto una piccola parte di codice che cambia la porzione URL href con tha stesso URL ma con "+" al posto di "" char spazio bianco, in modo da [artista] Lemon Jelly [/ artist] dovrebbe divenne Lemon Jelly

Non ho sperimentato con PHP e io non sono sicuro di quale sia il problema, ho utilizza questa sintassi in altra situazione, senza incontrare il problema.

qualcuno può aiutarmi a trovare dove ho sbagliato?

il tipo di errore è errore PHP Parse: errore di sintassi, T_LNUMBER inaspettato, aspettandosi T_VARIABLE o '$' in /...

È stato utile?

Soluzione

L'errore di analisi è dovuto al fatto che $1 non è un nome di variabile PHP valido. Essi devono iniziare con una lettera o un carattere di sottolineatura. La variabile $1 popolato nei parametri preg_replace sono solo validi dentro i parametri.

Provare qualcosa di più simile a questo:

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

Il modificatore e valuta la stringa di sostituzione come codice PHP, in modo che dovrebbe generare la stringa che si desidera.

Nota, non posso provarlo adesso, quindi potrebbe essere necessario modificarlo un po '. Siamo spiacenti:]
Modifica Non importa che, ho ottenuto una sospensione di un client FTP. Corretto il regex. Funziona:)

Altri suggerimenti

Si prega di fornire le linee 2-3 prima e dopo la linea che ha l'errore (numero di riga deve essere in errore PHP di analisi.

Questo non suona come un problema di espressioni regolari ... più come un problema in fuga.

Sono piuttosto nuovo a così, perché non potrei solo commentato alla domanda di chiedere questo (come quello che ho scritto non è in realtà una risposta)

  

Per evitare questo, ho scritto un po '   parte di codice che modificare l'URL href   parte con tha stesso URL ma con "+"   al posto di " "

Perché non usare urlencode sui contenuti del tag?

Si noti che urlencode deve essere utilizzato solo per i parametri di query; componenti di directory effettivi dovrebbero usare rawurlencode , come HTTP per sé non usa + al posto degli spazi.

Credo che il problema è con $ 1 di riferimento, che viene utilizzato nella funzione str_replace al di fuori degli argomenti preg_replace. $ 1 backreference funziona solo entro i confini di argomenti preg_replace, quindi non si può passare come una variabile a str_replace; si tenta di utilizzare $ 1 come una variabile, ma in PHP che è valido per un nome di variabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top