2009-12-27 7 views
0

J'ai un problème avec mon RegEx. Je veux traduire un lien BBCode commeAide avec RegEx

[link = www.stackoverflow.com] Stack Overflow [/ link]

dans un lien HTML comme

<a href='www.stackoverflow.com'>Stack-Overflow</a>. 

Dans mon String il est possibile de faire plus d'un lien dans le BBCode. I Aussi besoin d'une fonction pour traduire le html en BBCode.

Mes fonctions sont BBCode Pour HTML:

$Text = preg_replace('/\[link=([^ ]+).*\](.*)\[\/link\]/', '<a href="$1">$2</a>', $Text); 

HTML Pour BBCode:

$Text = preg_replace('/\<a href="([^ ]+).*\">(.*)\<\/a\>/Usi', '[link=$1]$2[/link]', $Text); 

Mon problème est avec des fonctions de thees, quand j'ai plus d'un lien, il ne fonctionne pas , et quand j'ai un lien traduit en HTML et je veux traduire en arrière, je n'ai que le premier caractère du lien.

Tout le monde peut-il m'aider? merci d'avance

+2

S'il vous plaît noter: http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html – pavium

Répondre

5

Comme pour votre premier problème, * est gourmand, donc il attrape tout entre le premier et le dernier lien. Une solution simple consiste à utiliser un qualificatif non gourmand, ou de ne pas permettre [] dans vos groupes:

\[link=([^ \[\]]+)\]([^\[\]]*)\[\/link\] 

De même, pour l'inverse:

<a href="([^ "]+)">([^<]*?)\<\/a\> 

est ici la version non-gourmand. Il permet [] dans les liens, et est encore plus court:

\[link=([^ ]*?)\](.*?)\[\/link\] 
+1

En utilisant le qualificatif non gourmand est assez bon, et permettrait [] dans le lien, car cela peut se produire. Par exemple. example.com/?arr[]=1&arr[]=2 –

+0

Bon point. Merci, Tor. – Kobi

+0

merci pour votre aide. c'était très utile. Cela fonctionne parfaitement. – wildhaber

0

Votre problème est avec le gourmand * utilisation.? pour le rendre non gourmand.

$Text = preg_replace(
    '/\[link=([^ ]+).*?\](.*?)\[\/link\]/', 
    '<a href="$1">$2</a>', 
    $Text 
); 
+0

il doit être à l'intérieur de la parens, sinon il fait quelque chose de complètement différent. –

+0

Oups, oui mon mauvais. Edité pour corriger l'erreur. – slebetman