在PHP中,我希望如果用户键入:
[LINK] url [/LINK]
它将用锚标记替换它:
<a href=url>url</a>
我该如何展示?我不知道如何将其翻译成正则表达式...
我尝试了以下内容:
[LINK][a-zA-Z0-9_-.]+[/LINK]
但显然这是不对的:(
答案 0 :(得分:1)
$str = '[LINK]http://google.com[/LINK]';
$str = preg_replace('/\[link\]([^\[\]]+)\[\/link\]/i', '<a href="$1">$1</a>', $str);
echo $str; // <a href="http://google.com">http://google.com</a>
说明:
\[link\] Match "[LINK]"
([^\[\]]+) Match any character except "[" and "]"
\[\/link\] Match "[/LINK]"
i Make it case-insensitive
答案 1 :(得分:0)
抓住链接,但总是需要领先 http:// 或 https:// ,否则网址将是 example.com/google.com 你也应该使用preg_replace_callback()作为xss unsanitized输入的可能性。
以下是一些示例:
<?php
//The callback function to pass matches as to protect from xss.
function xss_protect($value){
if(isset($value[2])){
return '<a rel="nofollow" href="'.htmlentities($value[1]).'">'.htmlentities($value[2]).'</a>';
}else{
return '<a rel="nofollow" href="'.htmlentities($value[1]).'">'.htmlentities($value[1]).'</a>';
}
}
$link ='[LINK]http://google.com[/LINK]';
$link = preg_replace_callback("/\[LINK\](.*)\[\/LINK\]/Usi", "xss_protect", $link);
echo $link;
?>
<a rel="nofollow" href="http://google.com">google.com</a>
或剥去http://&amp; https://来自链接然后在输出时附加它。
<?php
$link ='[LINK]google.com[/LINK]';
$link = preg_replace_callback("/\[LINK\](.*)\[\/LINK\]/Usi", "xss_protect", str_replace(array('http://','https://'),'',$link));
echo $link;
?>
<a rel="nofollow" href="http://google.com">google.com</a>
或者以不同的方式拥有BB代码链接,然后可以从链接地址指定链接名称,可以使回调函数处理多种类型的输出。
<?php
$link ='[LINK=google.com]Google[/LINK]';
$link = preg_replace("/\[LINK=(.*)\](.*)\[\/LINK\]/Usi", "xss_protect", str_replace(array('http://','https://'),'',$link));
echo $link;
?>
<a rel="nofollow" href="http://google.com">Google</a>