Вот то, что я хотел бы добавить на свой сайт.
Я предлагаю, чтобы пользователи веб-сайта отправляли свои страницы профиля со ссылками в этом формате:
(* http: //example.com X click_here *)
(* https: //www.facebook.com/xyz X facebook *)
(* http: //twitter.com X twitter *)
(* 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, отправить страницу профиля со ссылками на их личный веб-сайт, Facebook, Twitter, 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_hereif (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 foreachreturn $new_string;
}// close functionhyperlinks($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) { // editforeach($safe_text as $result)
{
$pairs = explode(" X ", $result);
$var1 = $pairs[0]; // result: http://example.com
$var2 = $pairs[1]; // result: click_hereif (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>
Я думал, что было бы намного лучше иметь возможность сказать:
Приходите мой веб-сайт или найди меня на 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;
?>
Других решений пока нет …