str_replace无法正确替换

时间:2012-02-01 20:23:37

标签: php parsing replace str-replace

我有以下简单的代码:

$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的东西,我试过了。

谢谢!

4 个答案:

答案 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>