我有以下简单的代码:
$text = str_replace($f,'<a href="'.$f.'" target="_blank">'.$u.'</a>',$text);
其中$ f是一个网址,如http://google.ca
,$ u是网址的名称(我的函数将其命名为'Google')。
我的问题是,如果我给我的函数一个像
这样的字符串http://google.ca http://google.ca
它返回
<a href="<a href="http://google.ca" target="_blank">Google</a>" target="_blank">Google</a> <a href="<a href="http://google.ca" target="_blank">Google</a>" target="_blank">Google</a>
这显然不是我想要的。我希望我的功能能够回显两个单独的可点击链接。但str_replace正在替换第一次出现(它在循环中循环遍历所有找到的URL),并且第一次出现已被替换。
如何告诉str_replace忽略那个特定的那个,然后转到下一个?给出的字符串是用户输入,所以我不能只给它一个静态偏移或任何带有substr的东西,我试过了。
谢谢!
答案 0 :(得分:1)
一种方式,虽然它有点像kludge:你可以使用一个临时标记(希望)不会出现在字符串中:
$text = str_replace ($f, '<a href="XYZZYPLUGH" target="_blank">' . $u . '</a>',
$text);
这样,第一次替换将不会再次被发现。然后在结束时(在处理完整行之后),只需更改标记:
$text = str_replace ('XYZZYPLUGH', $f, $text);
答案 1 :(得分:0)
为什么不将您的函数传递给一组URL?
function makeLinks(array $urls) {
$links = array();
foreach ($urls as $url) {
list($desc, $href) = $url;
// If $href is based on user input, watch out for "javascript: foo;" and other XSS attacks here.
$links[] = '<a href="' . htmlentities($href) . '" target="_blank">'
. htmlentities($desc)
. '</a>';
}
return $links; // or implode('', $links) if you want a string instead
}
$urls = array(
array('Google', 'http://google.ca'),
array('Google', 'http://google.ca')
);
var_dump(makeLinks($urls));
答案 2 :(得分:0)
如果我理解你的问题,你可以使用sprintf函数。我认为这样的事情应该有效:
function urlize($name, $url)
{
// Make sure the url is formatted ok
if (!filter_var($url, FILTER_VALIDATE_URL))
return '';
$name = htmlspecialchars($name, ENT_QUOTES);
$url = htmlspecialchars($url, ENT_QUOTES);
return sprintf('<a href="%s">%s</a>', $url, $name);
}
echo urlize('my name', 'http://www.domain.com');
// <a href="http://www.domain.com">my name</a>
我没有测试过它。
答案 3 :(得分:0)
我建议您在这里使用preg_replace而不是str_replace,如下代码:
$f = 'http://google.ca';
$u = 'Google';
$text='http://google.ca http://google.ca';
$regex = '~(?<!<a href=")' . preg_quote($f) . '~'; // negative lookbehind
$text = preg_replace($regex, '<a href="'.$f.'" target="_blank">'.$u.'</a>', $text);
echo $text . "\n";
$text = preg_replace($regex, '<a href="'.$f.'" target="_blank">'.$u.'</a>', $text);
echo $text . "\n";
<强>输出:强>
<a href="http://google.ca" target="_blank">Google</a> <a href="http://google.ca" target="_blank">Google</a>
<a href="http://google.ca" target="_blank">Google</a> <a href="http://google.ca" target="_blank">Google</a>