2013-06-17 6 views
0

Tehre ne semble pas être une réponse claire sur la meilleure façon de le faire.REGEX pour les liens bbcode + URL non-bbcode

J'ai quelques bbcode qui peuvent avoir des liens au format bbcode:

[url = http: //thisisalink.com] lien [/ url]

ainsi que possible copie/urls empâtées:

http://thisisalink.com

Je veux remplacer les deux cas, avec un lien cliquable. J'ai actuellement ce qui suit: regexs en cours d'exécution:

"/\[link=http:\/\/(.*?)\](.*?)\[\/link\]/is" 
"/\[link=https:\/\/(.*?)\](.*?)\[\/link\]/is" 
"/\[link=(.*?)\](.*?)\[\/link\]/is" 

$URLRegex = '/(?:(?<!(\[\/link\]|\[\/link=))(\s|^))'; // No [url]-tag in front and is start of string, or has whitespace in front 
$URLRegex.= '(';         // Start capturing URL 
$URLRegex.= '(https?|ftps?|ircs?):\/\/';   // Protocol 
$URLRegex.= '\S+';         // Any non-space character 
$URLRegex.= ')';         // Stop capturing URL 
$URLRegex.= '(?:(?<![[:punct:]])(\s|\.?$))/i';  // Doesn't end with punctuation and is end of string, or has whitespace after 

Il semble juste que je ne peux pas obtenir les deux à travailler. Dans ce cas, la dernière regex semble dissocier la première regex.

Bien sûr, cela a été documenté quelque part sur la meilleure façon d'obtenir à la fois des liens bbcode et des URL collés pour se relier sans conflit les uns avec les autres.

Répondre

0

J'ai fini par aller avec ça. Je l'ai ensuite passé faire un rappel qui me permet de faire un code spécial en php pour un contrôle de lien:

# MATCH '?://www.link.com' and make it a bbcode link 
$URLRegex = '/(?:(?<!(\[\/link\]|\[\/link=))(\s|^))'; // No [url]-tag in front and is start of string, or has whitespace in front 
$URLRegex.= '(';         // Start capturing URL 
$URLRegex.= '(https?|ftps?|ircs?|http?|ftp?|irc?):\/\/';   // Protocol 
$URLRegex.= '\S+';         // Any non-space character 
$URLRegex.= ')';         // Stop capturing URL 
$URLRegex.= '(?:(?<![[:punct:]])(\s|\.?$))/i'; 
$output = preg_replace($URLRegex, "$2[link=$3]$3[/link]$5", $output); 

# MATCH 'www.link.com' and make it a bbcode link 
$URLRegex2 = '/(?:(?<!(\[\/link\]|\[\/link=))(\s|^))'; // No [url]-tag in front and is start of string, or has whitespace in front 
$URLRegex2.= '(';         // Start capturing URL 
$URLRegex2.= 'www.';   // Protocol 
$URLRegex2.= '\S+';         // Any non-space character 
$URLRegex2.= ')';         // Stop capturing URL 
$URLRegex2.= '(?:(?<![[:punct:]])(\s|\.?$))/i'; 
$output = preg_replace($URLRegex2, "$2[link=http://$3]$3[/link]$5", $output); 


# link up a [link=....]some words[/link] 
$output = preg_replace_callback(
    "/\[link=(.*?):\/\/(.*?)\](.*?)\[\/link\]/is", 
    Array($this,'bbcode_format_link1'), 
    $output); 
2

que vous pouvez faire est d'utiliser une alternance qui commencent avec le motif de bbcode pour éviter le remplacement du lien dans BBcode, par exemple:

$pattern = '~\[url\s*+=\s*+([^]\s]++)]([^[]++)\[/url]|((http://\S++))~i'; 
$result = preg_replace($pattern, '<a href="$1$3">$2$4</a>', $string); 

Notez que j'ai capturé deux fois la copier/coller url pour éviter d'utiliser la fonction preg_replace_callback.

J'ai utilisé un modèle simplifié pour l'URL de copie/collée, vous pouvez toutefois le remplacer par ce que vous voulez traiter https, ftp, ftps ....