PHP在RSS提要中附加所有URL

I am trying to append all urls in a RSS feed with a extra string (like "/testing123" etc). The original url format from the RSS looks like this:

<link rel="alternate" type="text/html" href="http://website.com/item/name1/2162561"/>
<link rel="alternate" type="text/html" href="http://website.com/item/name2/2162435"/>

etc, I used regexp with str_replace in a for loop but i cannot seem to get it working correctly and if i use preg_replace i get errors. When i just echo out the urls with the string appended it appears how i want but when i use str_replace then the urls looks like this instead:

http://website.com/testing123/item/name1/2162561
http://website.com/testing123/item/name2/2162435

I need the urls with the append string at the end when they get replaced however like this:

<link rel="alternate" type="text/html" href="http://website.com/item/name1/2162561/testing123"/>
<link rel="alternate" type="text/html" href="http://website.com/item/name2/2162435/testing123"/>

The code i have is:

<?php 

// The append string
$append = '/testing123';

// The file
$file = "RSS.txt";

// Get the files contents
$contents = file_get_contents($file);

// The search pattern
$SearchPattern = '/href=["|\'](.[^"|\']+)/i';

// Run preg_match_all to grab all the Matches
preg_match_all( $SearchPattern, $contents, $Matches );

// Check to see if we have at least 1 match
$MatchCount = count($Matches[0]);

// If there is more than 1 match then run a for loop
if ( $MatchCount > 0 ) {
     for ( $i=0; $i < $MatchCount ; $i++ ) {

          $temp = $Matches[0][$i];
          echo $temp . $append . '<br />'; // Appears to work

          //$contents = str_replace($temp, $temp . $append, $contents); // But str_replace doesn't seem to work

          //preg_replace($temp, $temp . $append, $contents); // And using preg_replace gives a error

     };
};

echo $contents; // Display the contents

?>

This should work :

<?php 

// The append string
$append = '/testing123';

// The file
$file = "RSS.txt";

// Get the files contents
$contents = file_get_contents($file);

// The search pattern
$SearchPattern = '/(<link .* href=".*)("\/>)/i';

// Run preg_match_all to grab all the Matches
preg_match_all( $SearchPattern, $contents, $matches );

for($i=0;$i<count($matches[1]);$i++){
    echo $matches[1][$i].$append.$matches[2][$i]."
";
}

?>

Basically, it filters the lines with regular expressions and extracts both sides of the index where you want to append text.

It then concatenates it all.

you need another variable to hold an array of $temp.

so

$match[i] = $temp . $append;

then echo $match later (in a for loop or for each loop)

Or keep match as a string and append the
as well

// If there is more than 1 match then run a for loop

if ( $MatchCount > 0 ) {
     for ( $i=0; $i < $MatchCount ; $i++ ) {

          $temp = $Matches[0][$i];
          $match .= $temp . $append . '<br />'; // Appears to work

          //$contents = str_replace($temp, $temp . $append, $contents); // But str_replace doesn't seem to work

          //preg_replace($temp, $temp . $append, $contents); // And using preg_replace gives a error

     };
};

echo $match; // Display the contents

?>

Instead of preg matching/replacing, you could use XPath and DOMDocument

$html = <<< EOF
<xml>
  <items>
    <item>
      <link href="/testing/123" />
      <link href="http://test" />
      <font><tag>x</tag></font>
    </item>
  </items>
</xml>
EOF;

Example XML is absurd, of course. Code below checks for relative links, and makes them absolute.

$doc = new DOMDocument();
@$doc->loadXML( $html );
$xpath = new DOMXpath( $doc );

$links = $xpath->query( "//link" );
for( $i = 0; $i < $links->length; $i++ ) {
    $href = $links->item($i)->getAttribute( 'href' );
    if( substr($href, 0, 4) != 'http' ) { 
        $links->item($i)->setAttribute( 'href', "http://" . ltrim($href, '/') );
    }
}

echo $doc->saveHTML();

That spits out transformed HTML:

<xml>
<items>
<item>
<link href="http://testing/123">
<link href="http://test">
<font><tag>x</tag></font>
</item>
</items>
</xml>