用于bbcode链接和非bbcode URL的REGEX

时间:2013-06-17 15:51:22

标签: php regex bbcode

对于如何以最好的方式做到这一点,Tehre似乎并不是一个明确的答案。

我有一些bbcode可能有bbcode格式的链接:

[URL = HTTP://thisisalink.com]链接[/ URL]

以及可能的复制/粘贴网址:

http://thisisalink.com

我想用可点击的链接替换这两个实例。我目前有以下内容:正在运行的正则表达式:

"/\[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

似乎我无法兼顾两者。在这种情况下,最后一个正则表达式似乎取消了第一个正则表达式的链接。

当然,这已被记录在最佳方式上,以便将bbcode链接和粘贴的URL链接在一起而不会相互冲突。

2 个答案:

答案 0 :(得分:2)

你可以做的是使用以bbcode模式开头的替换,以避免替换bbcode标签内的链接,例如:

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

请注意,我已经捕获了两次复制/粘贴的网址,以避免使用 preg_replace_callback 功能。

我使用了复制/粘贴网址的简化模式,但您可以将其替换为您想要处理的 https,ftp,ftps ...

答案 1 :(得分:0)

我最终还是坚持了下去。然后我通过它做了一个回调,它允许我在php中做一些特殊的代码进行一些链接检查:

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