对于如何以最好的方式做到这一点,Tehre似乎并不是一个明确的答案。
我有一些bbcode可能有bbcode格式的链接:
[URL = HTTP://thisisalink.com]链接[/ URL]
以及可能的复制/粘贴网址:
我想用可点击的链接替换这两个实例。我目前有以下内容:正在运行的正则表达式:
"/\[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链接在一起而不会相互冲突。
答案 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);