2012-02-01 45 views
0

我有以下的,简单的代码:str_replace函数不更换正确

$text = str_replace($f,'<a href="'.$f.'" target="_blank">'.$u.'</a>',$text); 

其中$ f是一个URL,如http://google.ca,和$ u是URL的名称(我的功能将其命名为“谷歌”) 。

我的问题是,是,如果我给我的函数的字符串像

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,我已经尝试过。

谢谢!

+6

这并不是说'str_replace'被替换不正确的,它只是你”重新使用它。 (肛门,但是真的。):-) – 2012-02-01 20:25:45

+0

是的,我知道。我想知道是否有其他方法可以正常工作。 – Scott 2012-02-01 20:30:02

回答

1

的一种方式,但它是一个有点杂牌的:你可以使用临时标志物(希望)将不会出现在字符串中

$text = str_replace ($f, '<a href="XYZZYPLUGH" target="_blank">' . $u . '</a>', 
        $text); 

这样一来,第一次换人也不会再次发现。那么,在年底(你处理整个行之后),只需更改标记回:

$text = str_replace ('XYZZYPLUGH', $f, $text); 
+0

这似乎是工作,谢谢! – Scott 2012-02-01 20:44:28

0

为什么不通过你的网址功能的阵列,而不是?

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)); 
+0

这基本上是我现在正在做的。循环遍历每个已找到的“URL”并将其转换为链接的foreach循环。 – Scott 2012-02-01 20:39:36

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> 

我还没有测试它。

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

OUTPUT:

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