Php str_ireplace()不仅替换最后一个匹配项

Php str_ireplace()不仅替换最后一个匹配项,php,Php,我正在尝试替换网页的URL。我使用DOM获取页面中的所有链接,循环浏览链接,并使用str_ireplace逐个查找和替换。 str_ireplace仅替换最后一个链接。当我计数时,它给出了要替换的链接数的正确计数,但不替换链接 $contents=file_get_contents($_GET['page']); $dom = new DOMDocument; @$dom->loadHTML($contents); $links = $dom->

我正在尝试替换网页的URL。我使用DOM获取页面中的所有链接,循环浏览链接,并使用str_ireplace逐个查找和替换。 str_ireplace仅替换最后一个链接。当我计数时,它给出了要替换的链接数的正确计数,但不替换链接

    $contents=file_get_contents($_GET['page']);
    $dom = new DOMDocument;
    @$dom->loadHTML($contents);    
    $links = $dom->getElementsByTagName('a');
$c=0;
//Iterate over the extracted links and display their URLs
    foreach ($links as $link){
        //echo $link->nodeValue;
        $arr['retUrl']=$link->getAttribute('href');
        $xyz=json_encode($arr);
        $rurl=$base_url.'?ret_url='.urlencode($xyz);
        echo $arr['retUrl'].'<br>'.$rurl.'<br><br><br>';

        $x=str_ireplace($link->getAttribute('href'),$rurl,$contents,$count);
        $c=$c+$count;
        echo '--'.$count.'--';
    }

    echo $x;

这是因为您输出了$x,那么$x是什么呢?它是$contents,处理了最后一个$link。我确信您也需要将所有以前的替换内容保存在$contents中。替换

$x=str_ireplace($link->getAttribute('href'),$rurl,$contents,$count);


在这里,您将用每个替换的链接覆盖$contents。循环后-输出$contents。

查看它,将其更改为:

   $x .= str_ireplace($link->getAttribute('href'),$rurl,$contents,$count);

当他从不使用变量$content开始时,为什么要将$content=设置为任何值。这不在他的范围之内,仍然是错误的。您使用$contents进行的操作与他使用$x的操作相同。您应该执行$contents.=将更新的内容附加到字符串中。即使如此,这也是错误的,因为他已经在作用域的前面设置了$contents,它将直接从文件I/O以.Nope开头附加到已经建立的内容。每个循环$x都是一个新值,在任何地方都不会使用。因此,我在$contents中覆盖了everylink,并再次将覆盖的文本保存到$contents。对于您的解决方案,您将在先前替换的$contents中追加$contents。但是我想你太聪明了,不懂它。为什么你会在interator的作用域内重用$contents,而它却存在于该作用域之外?这样做的目的是什么?在你糟糕的例子的末尾$contents的值仍然只包含一个链接;找出正确的数组层次结构,然后重写迭代器。然后,将$x=str\u ireplace更改为$x.=str\u ireplace相同的输出。没有任何变化它是否与url格式有关?我是说特殊人物。它应该替换的URL是以下类型:`&;othersrcp=2988543不,一旦它们在字符串中,它们就在字符串中。您的var_dump应该向您显示一个包含其中每个链接的大型数组,如果没有,那就是一个问题。但是这行代码:echo$arr['retUrl']..$rurl。;打印所有要替换的URL。因此,我认为$links没有任何问题
   $x .= str_ireplace($link->getAttribute('href'),$rurl,$contents,$count);