使用 PHP 修改字符串中的链接
Modify links in a string with PHP
我正在尝试通过添加重定向在字符串中标记 links。数据以字符串格式来自 MySQL 数据库,看起来像这样:
$string = "<p><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>";
我正在使用函数 strpos 和指针 "http" 来获取字符串中所有 link 的位置,并将它们存储在一个名为 positions 的数组中。该数组填充了 link 开始的字符,如下所示:
Array
(
[0] => 12
[1] => 100
)
然后我遍历位置数组并使用 substr_replace 在 http 之前添加重定向 link。但是,这仅适用于一个 link,如果我在字符串中有多个 link,它会被覆盖。有人对此有任何巧妙的解决方案吗?
这是我的代码:
function stringInsert($str,$pos,$insertstr)
{
if (!is_array($pos))
$pos=array($pos);
$offset=-1;
foreach($pos as $p)
{
$offset++;
$str = substr($str, 0, $p+$offset) . $insertstr . substr($str, $p+$offset);
}
return $str;
}
$string = "<p><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>";
$needle = "http";
$lastPos = 0;
$positions = array();
while (($lastPos = strpos($string, $needle, $lastPos))!== false) {
$positions[] = $lastPos;
$lastPos = $lastPos + strlen($needle);
}
$str_to_insert = "http://redirect.com?link=";
foreach ($positions as $value) {
$finalstring = substr_replace($string, $str_to_insert, $value, 0);
}
最终结果应该是这样的:
$string = "<p><a href='http://redirect.com?link=http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://redirect.com?link=http://facebook.com'>Friend on Facebook</a></p>";
试试这个
str_replace("href='", "href='http://redirect.com?link=", $string);
我认为更舒适的解决方案可能是使用 str_replace (http://php.net/manual/en/function.str-replace.php)
做这样的事情:
$string = str_replace(
['http://','https://'],
['http://redirect.com?link=http://', 'http://redirect.com?link=https://'],
$sourceString
);
相反,让我们使用 DOMDocument 解析器,它允许我们利用针对 HTML 个字符串的规范化方法。
$doc = new DOMDocument();
$doc->loadHTML($string);
现在我们可以遍历所有锚元素并进行必要的修改:
foreach( $doc->getElementsByTagName("a") as $anchor) {
$newLink = "http://example.com";
$anchor->setAttribute('href', $newLink );
}
然后您可以在完成后执行 echo $doc->saveHTML();
。
您也可以在实际的 foreach 循环中执行条件比较。
我会使用正则表达式:
$str = "<p><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>";
$str = preg_replace('/([\'\"])(http[^\'\"]+)([\'\"])/', 'http://redirect.com?link=', $str);
echo htmlspecialchars($str);
我得到的输出:<p><a href='http://redirect.com?link=http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://redirect.com?link=http://facebook.com'>Friend on Facebook</a></p>
请记住,最后一行仅用于显示目的。使用 Escaped html 以便您可以看到结果。对于实际工作的链接,您不需要 htmlspecialchars
调用。
Jquery 这样做的方式:
HTML
<p id="addRedirect"><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>
Jquery代码
$('#addRedirect > a').each(function(){
$(this).attr('href','http://redirect.com?link=' + $(this).attr('href'));
});
我正在尝试通过添加重定向在字符串中标记 links。数据以字符串格式来自 MySQL 数据库,看起来像这样:
$string = "<p><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>";
我正在使用函数 strpos 和指针 "http" 来获取字符串中所有 link 的位置,并将它们存储在一个名为 positions 的数组中。该数组填充了 link 开始的字符,如下所示:
Array
(
[0] => 12
[1] => 100
)
然后我遍历位置数组并使用 substr_replace 在 http 之前添加重定向 link。但是,这仅适用于一个 link,如果我在字符串中有多个 link,它会被覆盖。有人对此有任何巧妙的解决方案吗?
这是我的代码:
function stringInsert($str,$pos,$insertstr)
{
if (!is_array($pos))
$pos=array($pos);
$offset=-1;
foreach($pos as $p)
{
$offset++;
$str = substr($str, 0, $p+$offset) . $insertstr . substr($str, $p+$offset);
}
return $str;
}
$string = "<p><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>";
$needle = "http";
$lastPos = 0;
$positions = array();
while (($lastPos = strpos($string, $needle, $lastPos))!== false) {
$positions[] = $lastPos;
$lastPos = $lastPos + strlen($needle);
}
$str_to_insert = "http://redirect.com?link=";
foreach ($positions as $value) {
$finalstring = substr_replace($string, $str_to_insert, $value, 0);
}
最终结果应该是这样的:
$string = "<p><a href='http://redirect.com?link=http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://redirect.com?link=http://facebook.com'>Friend on Facebook</a></p>";
试试这个
str_replace("href='", "href='http://redirect.com?link=", $string);
我认为更舒适的解决方案可能是使用 str_replace (http://php.net/manual/en/function.str-replace.php)
做这样的事情:
$string = str_replace(
['http://','https://'],
['http://redirect.com?link=http://', 'http://redirect.com?link=https://'],
$sourceString
);
相反,让我们使用 DOMDocument 解析器,它允许我们利用针对 HTML 个字符串的规范化方法。
$doc = new DOMDocument();
$doc->loadHTML($string);
现在我们可以遍历所有锚元素并进行必要的修改:
foreach( $doc->getElementsByTagName("a") as $anchor) {
$newLink = "http://example.com";
$anchor->setAttribute('href', $newLink );
}
然后您可以在完成后执行 echo $doc->saveHTML();
。
您也可以在实际的 foreach 循环中执行条件比较。
我会使用正则表达式:
$str = "<p><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>";
$str = preg_replace('/([\'\"])(http[^\'\"]+)([\'\"])/', 'http://redirect.com?link=', $str);
echo htmlspecialchars($str);
我得到的输出:<p><a href='http://redirect.com?link=http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://redirect.com?link=http://facebook.com'>Friend on Facebook</a></p>
请记住,最后一行仅用于显示目的。使用 Escaped html 以便您可以看到结果。对于实际工作的链接,您不需要 htmlspecialchars
调用。
Jquery 这样做的方式:
HTML
<p id="addRedirect"><a href='http://twitter.com'>Follow on Twitter</a> and please friend on <a href='http://facebook.com'>Friend on Facebook</a></p>
Jquery代码
$('#addRedirect > a').each(function(){
$(this).attr('href','http://redirect.com?link=' + $(this).attr('href'));
});