2014-11-23 84 views
-3

这是我想要添加到我的网站的内容。将文本网址转换为可点击的文字或图片链接

我建议有网站用户提交自己的个人资料页,在这种格式的链接:

(* HTTP://示例.com X click_here *)
(* HTTPS://www.facebook。 * *
(* http: .com *)

而计划是产生如下链接:

<a href="https://facebook.com/xyz" target="_blank"><img src="facebook.gif" alt="facebook"></a> 
<a href="http://twitter.com?foo=bar&foo2=bar2" target="_blank"><img src="twitter.gif" alt="twitter"></a> 
<a href="http://linkedin.com/xyz" target="_blank"><img src="facebook.gif" alt="facebook"></a> 
<a href="http://example.com?foo=bar&foo2=bar2" target="_blank">click_here</a> 
<a href="http://www.other.com" target="_blank">http://www.other.com</a> 


参数:
1.允许没有HTML知识的成员一个带有链接的个人资料页面提交自己的个人网站,Facebook,微博,LinkedIn等
2.防止XSS


只要我有限的知识允许,我已经采取了这一点。下面的代码是我的微弱尝试。我将继续尝试解决如何做到这一点。我相信你将能够遵循我想要做的事情的逻辑。

任何援助将不胜感激。

<?php 


    // member profile retrieved from MySQL 
$unsafe = " 
    blah blah blah (*http://example.com X click_here*) blah blah blah 
    blah blah blah (*https://www.facebook.com/xyz X facebook*) blah blah blah blah 
    blah blah blah (*http://twitter.com X twitter*) blah blah blah blah blah 
    blah blah blah (*http://www.linkedin.com X linkedin*) blah blah blah 
    blah blah blah (*http://www.other.com*) blah blah blah"; 

$safe_text = htmlspecialchars($unsafe, ENT_QUOTES, 'UTF-8'); 

    // I assume this can not be done without creating a function 
function hyperlinks ($safe_text) 
{ 

    $pattern = "%\(\*(.*)\*\)%"; 

    preg_match($pattern, $safe_text, $matches); 
    // $matches[1] "http://example.com X click_here" 

    $pairs = explode(" X ", $matches[1]); 

    $var1 = $pairs[0]; // result: http://example.com 
    $var2 = $pairs[1]; // result: click_here 

    if (isset($var2)) 
    { 
     if ($var2 === "facebook") $var2 = '<img src="/images/facebook.gif" alt="facebook">'; 
     if ($var2 === "twitter") $var2 = '<img src="/images/twitter.gif" alt="twitter">'; 
     if ($var2 === "linkedin") $var2 = '<img src="/images/linkedin.gif" alt="linkedin">'; 
     if (($var2 != "facebook") && ($var2 != "twitter") && ($var2 != "linkedin")) 
     { 
      // this line is not needed, just shows logic 
      $var2 = $var2; // the text provided is var2 
     } 

    } else { $var2 = $var1; } // var2 doesn't exist 



    $replacement = "<a href='$var1' target='_blank'>$var2</a>"; //edit switched "''"  


    $new_string = preg_replace($pattern, $replacement, $safe_text); 

echo $new_string ."<br/>"; 


    return $new_string; // edit added 
} 
hyperlinks($safe_text); //edit added 




    /************ 
$new_string should look like: 

$new_string = " 
blah blah blah <a href="https://facebook.com/xyz" target="_blank"><img src="facebook.gif" alt="facebook"></a> blah blah blah 
blah blah blah <a href="http://twitter.com?foo=bar&foo2=bar2" target="_blank"><img src="twitter.gif" alt="twitter"></a> blah blah blah 
blah blah blah <a href="http://linkedin.com/xyz" target="_blank"><img src="facebook.gif" alt="facebook"></a> blah blah blah 
blah blah blah <a href="http://example.com?foo=bar&foo2=bar2" target="_blank">click_here</a> blah blah blah 
blah blah blah <a href="http://www.other.com" target="_blank">http://www.other.com</a> blah blah blah"; 

*************/ 




?> 

好的。所以第一次尝试并没有走得太远。

这里我第二次尝试。

<?php 

error_reporting(E_ALL); 

    // member profile retrieved from mysql 
$unsafe = "blah blah blah (*http://example.com?foo=bar&foo2=bar2 X click_here*) blah blah blah 
      blah blah blah (*https://www.facebook.com/xyz X facebook*) blah blah blah blah 
      blah blah blah (*http://twitter.com X twitter*) blah blah blah blah blah 
      blah blah blah (*http://www.linkedin.com X linkedin*) blah blah blah 
      blah blah blah (*http://www.other.com*) blah blah blah"; 

$safe_text = htmlspecialchars($unsafe, ENT_QUOTES, 'UTF-8'); 

    // I assume this can not be done without creating a function 
function hyperlinks ($safe_text) 
{ 


    $pattern = "%\(\*(.*)\*\)%"; 


    preg_match_all($pattern, $safe_text, $matches); // matches[1] "http://example.com X click_here" 



foreach($matches[1] as $result) 
    { 

$pairs = explode(" X ", $result); 

    $var1 = $pairs[0]; // result: http://example.com 
    $var2 = $pairs[1]; // result: click_here 


if (isset($var2)) 
    { 
     if ($var2 === "facebook") $var2 = '<img src="/images/facebook.gif" alt="facebook">'; 
     if ($var2 === "twitter") $var2 = '<img src="/images/twitter.gif" alt="twitter">'; 
     if ($var2 === "linkedin") $var2 = '<img src="/images/linkedin.gif" alt="linkedin">'; 
     if (($var2 != "facebook") && ($var2 != "twitter") && ($var2 != "linkedin")) 
     { 
      // this line is not needed, just shows logic 
      $var2 = $var2; // the text provided is var2 
     } 

    } else { $var2 = $var1; } // var2 doesn't exist 


// var_dump($result); 


    $replacement = "<a href='$var1' target='_blank'>$var2</a>"; 


// echo $replacement ."<br/>"; 

    $new_string = preg_replace($pattern, $replacement, $safe_text); 

echo $new_string ."<br/>"; 



    }// close foreach 



    return $new_string; 
}// close function 


hyperlinks($safe_text); 



?> 

这一个输出结果...太多的结果。

第一个preg_match_all()找到5个最终得到乘法的链接,它们是preg_replace(),所以它产生了25个链接。每种品种5种。

基本上知道我应该只有1个preg_something?谷歌搜索:调用preg_replace中的一个函数,发现我应该使用preg_replace_callback,它确实允许内部的函数。

所以第三次尝试:

<?php 

error_reporting(E_ALL); 

    // member profile retrieved from mysql 
$unsafe = "blah blah blah (*http://example.com?foo=bar&foo2=bar2 X click_here*) blah blah blah 
      blah blah blah (*https://www.facebook.com/xyz X facebook*) blah blah blah blah 
      blah blah blah (*http://twitter.com X twitter*) blah blah blah blah blah 
      blah blah blah (*http://www.linkedin.com X linkedin*) blah blah blah 
      blah blah blah (*http://www.other.com*) blah blah blah"; 

$safe_text = htmlspecialchars($unsafe, ENT_QUOTES, 'UTF-8'); 


// I assume this can not be done without creating a function 

$pattern = "%\(\*(.*)\*\)%"; 

$new_string = preg_replace_callback($pattern, 'safe_text', $safe_text); 

// Error: preg_replace_callback(): Requires argument 2, 'safe_text', to be a valid callback 

function safe_text($text) { // edit 


foreach($safe_text as $result) 
    { 

$pairs = explode(" X ", $result); 

    $var1 = $pairs[0]; // result: http://example.com 
    $var2 = $pairs[1]; // result: click_here 


if (isset($var2)) 
    { 
     if ($var2 === "facebook") $var2 = '<img src="/images/facebook.gif" alt="facebook">'; 
     if ($var2 === "twitter") $var2 = '<img src="/images/twitter.gif" alt="twitter">'; 
     if ($var2 === "linkedin") $var2 = '<img src="/images/linkedin.gif" alt="linkedin">'; 
     if (($var2 != "facebook") && ($var2 != "twitter") && ($var2 != "linkedin")) 
     { 
      // this line is not needed, just shows logic 
      $var2 = $var2; // the text provided is var2 
     } 

    } else { $var2 = $var1; } // var2 doesn't exist 

    } // close foreach 


    $replacement = "<a href='$var1' target='_blank'>$var2</a>"; 

echo $replacement ."<br/>"; 

     return $new_string; 


} // close function 


// $new_text = hyperlinks($safe_text); 



echo $new_string; //error: unexpected 'echo' (T_ECHO) 



?> 
+1

那么它是怎样现在看? – Mihai 2014-11-23 20:12:54

+0

没有输出。我猜我需要'code'array_shift($ matches);'code'和类似于'code'的东西$ last = - (strlen(strrchr($ text,“/”)))+ 1; if($ last <0){ $ text = substr($ text,0,$ last)。 “&hellip;”; }'code' – Tom 2014-11-23 20:58:11

+0

现在它输出click_here超链接覆盖所有链接。它并没有通过链接和处理每一个。 – Tom 2014-11-23 22:29:07

回答

0

我花了很多的努力,但我终于得到它。我将在我的网站上使用它。

所有其他“转换纯文本为超链接”的例子在这个风格创建的链接:

<a href="http://www.example.com">http://www.example.com</a> 

我认为这将是更好不得不说的选项:
前来参观my_website或找我在Facebook


<?php 

$unsafe = "blah blah blah (*http://example.com?foo=bar&foo2=bar2 X click_here*) blah blah blah 
      blah blah blah (*https://www.facebook.com/xyz X facebook*) blah blah blah blah 
      blah blah blah (*http://twitter.com X twitter*) blah blah blah blah blah 
      blah blah blah (*http://www.linkedin.com X linkedin*) blah blah blah 
      blah blah blah (*http://www.other.com*) blah blah blah"; 



$safe_text = htmlspecialchars($unsafe, ENT_QUOTES, 'UTF-8'); 

function make_hyperlinks($matches) 
{ 

$matches = $matches[1]; 

    if (strpos($matches, " X ") !== FALSE) 
    { 
    $pairs = explode(" X ", $matches); 

     } else { 

    $pairs[0] .= $matches; 
    }  

    $var0 = $pairs[0]; 
    $var1 = $pairs[1]; 

    if (isset($var1)) 
     { 
     if ($var1 === "facebook") $var1 = '<img src="/images/facebook.gif" alt="facebook">'; 
     if ($var1 === "twitter") $var1 = '<img src="/images/twitter.gif" alt="twitter">'; 
     if ($var1 === "linkedin") $var1 = '<img src="/images/linkedin.gif" alt="linkedin">'; 
     } else {$var1 = $var0; } // var1 doesn't exist 

    return "<a href='$var0' rel='nofollow' target='_blank'>$var1</a>"; 

} 

$new_string = preg_replace_callback("%\(\*(.*)\*\)%", "make_hyperlinks", $safe_text); 

// echo $new_string; 

?> 
相关问题