Question

Je suis en train de faire une classe d'analyseur bbcode qui peut créer des balises personalyzed, mais j'ai un problème avec urls

Je l'ai fait tout ce que je besoin sans problèmes particuliers grâce à des expressions régulières, mais j'ai un problème lorsque je tente de créer une balise spéciale qui pointent vers une URL spécifiée.

Dans ma classe, j'ai ajouté une méthode comme ceci:

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

le code fonctionne très bien avec urls classique [url] http://ciao.com [/ url] & [url = http://ciao.com] ciao [/ url]

mais j'ai un problème avec le cas d'une page spéciale url sujet que le style last.fm, donc [artiste] Lemon Jelly [/ artiste].

Le bblink est converti en Lemon Jelly (je l'ai utilisé les espaces seulement pour afficher le code de lien).
Le lien a les espaces blancs sur l'attribut href ne peut donc pas ne marchera jamais.

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

Pour éviter cela, je l'ai écrit une petite partie de code qui modifie la partie URL href avec tha même URL, mais avec « + » à la place de « » char espaces blancs, donc [artiste] Lemon Jelly [/ artiste] devrait devient Lemon Jelly

Je ne suis pas expérimenté avec PHP et je ne suis pas sûr quel est le problème, j'ai utilise cette syntaxe dans une autre situation sans rencontrer le problème.

quelqu'un peut me aider à trouver où je me trompe?

le type d'erreur est une erreur PHP Parse: erreur de syntaxe, T_LNUMBER inattendue, attendant T_VARIABLE ou '$' dans /...

Était-ce utile?

La solution

L'erreur d'analyse syntaxique est due au fait que $1 n'est pas un nom de variable PHP valide. Ils doivent commencer par une lettre ou un trait de soulignement. La variable $1 peuplée dans les paramètres de preg_replace sont juste valables à l'intérieur des paramètres.

Essayez quelque chose comme ceci:

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

Le modificateur de e évalue la chaîne de remplacement sous forme de code PHP, ce qui devrait générer la chaîne que vous voulez.

Remarque, je ne peux pas tester en ce moment, vous devrez peut-être modifier un peu. Désolé:]
Modifier Qu'à cela ne tienne, je suis une prise d'un client FTP. Correction du regex. Il fonctionne:)

Autres conseils

S'il vous plaît fournir les 2-3 lignes avant et après la ligne qui a l'erreur (numéro de ligne doit être dans l'erreur d'analyse syntaxique de PHP.

Cela ne ressemble pas à un problème de ... plus comme regex un problème s'échapper.

Je suis assez nouveau à SO, pourquoi ne pourrais-je viens de parler à la question de poser (comme ce que je l'ai écrit est pas vraiment une réponse)

  

Pour éviter cela, je l'ai écrit un peu   une partie de code qui modifier l'URL href   partie avec tha même URL, mais avec « + »   à la place de " «

Pourquoi ne pas utiliser urlencode sur le contenu de la balise?

Notez que urlencode ne doit être utilisé pour les paramètres de la requête; composants de répertoire réels devraient utiliser rawurlencode , comme HTTP lui-même ne pas utiliser + au lieu des espaces.

Je crois que le problème est la référence 1 $, qui est utilisé dans la fonction str_replace en dehors des arguments de preg_replace. Le 1 $ backreference ne fonctionne que dans les limites des arguments de preg_replace, donc vous ne pouvez pas passer comme une variable à str_replace; il essaie d'utiliser 1 $ comme une variable, mais en PHP qui est valide pour un nom de variable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top