将文本 URL 转换为可点击的文本或图像链接


convert text url into clickable text or image link

这是我想添加到我的网站上的东西。

我建议网站用户提交他们的个人资料页面,其中包含以下格式的链接:

(*http://example.com X click_here*)
(*https://www.facebook.com/xyz X facebook*)
(*http://twitter.com X 推特*)
(*http://www.linkedin.com X LinkedIn*)
(*http://www.other.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 的会员提交个人资料页面,其中包含指向其个人网站、脸书、推特、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??Googled:在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) 

?> 

花了很多精力,但我终于明白了。我将在我的网站上使用它。

所有其他"将纯文本转换为超链接"示例都以这种样式创建了链接:

<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;
?>