2013-07-06 4 views
2

J'essaie actuellement d'obtenir une URL à partir d'un BBCode. Il y a quatre possibilités pour cela, et c'est mon problème actuel:URL-BBCode Regex

[url]http://stackoverflow.com/[/url] 
[url='http://stackoverflow.com/']http://stackoverflow.com/[/url] 
[url="http://stackoverflow.com/"]http://stackoverflow.com/[/url] 
[url=http://stackoverflow.com/]http://stackoverflow.com/[/url] 

J'ai besoin des deux. Ceci est, ce que j'ai jusqu'à présent:

/\[url(?:\=\'([^\'"]+)\')?](.+?)\[\/url]/i 

Mais cela ne fonctionne juste avec le cas 1 & 2.

EDIT:

Cela fonctionne mieux:

/\[url(?:\=(?:[\"|'])?(.*)(?:[^[]+)?)?\](.*)\[\/url\]/i 

Mais encore pas parfait.

EDIT:

Je suppose que, je l'ai. Il peut avoir besoin d'optimisation, mais il semble fonctionner:

/\[url(?:\=("|\'|)?(.*)?\1)?\](.*)\[\/url\]/i 

Voir regexp-tester

+0

duplication possible de [REGEX pour les liens bbcode + URL non bbcode] (http://stackoverflow.com/questions/17151716/regex-for-bbcode-links-non-bbcode-urls) – PeeHaa

+0

Pas exactement, mais proche – user2557188

Répondre

3

Vous pouvez utiliser ce modèle:

$pattern = '~\[url(?|=[\'"]?([^]"\']+)[\'"]?]([^[]+)|](([^[]+)))\[/url]~'; 
$replacement = '<a href="$1">$2</a>'; 

$result = preg_replace($pattern, $replacement, $subject); 

L'idée est de conserver les numéros de groupes pour chaque branche de l'alternance en utilisant la branche réinitialiser la fonctionnalité. De cette façon, le groupe 1 contient toujours l'URL et le groupe 2 la description du lien. Quand il n'y a pas de description, l'url est utilisée en place, c'est pourquoi l'URL est enfermée deux fois dans un groupe de capture pour la seconde branche.

+0

Fonctionne parfaitement. Je vous remercie. – user2557188

0

Essayez cela, il travaillera

<?php 
    $urlsearch = "(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\[email protected]?^=%&amp;\/~+#-])?"; 
    $text = preg_replace("/\[url\]($urlsearch)\[\/url\]/", "<a href=\"$1\">$1</a>", $text); 
    $text = preg_replace("(\[url\=[\"']?($urlsearch)[\"']?\](.+?)\[/url\])", "<a href=\"$1\">$5</a>", $text); 

    print_r($text); 
?> 
+0

Voir ma modification ci-dessus. – user2557188

+0

@ user2557188 ​​Ouais je l'ai eu, code mis à jour, maintenant vérifier – bystwn22

+0

On dirait une exagération pour mon cas;) Ty de toute façon. – user2557188