PHP Mehrere URLs im String ersetzen

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
846
Hallo,

und zwar möchte ich URLs in einem String ersetzen. Wenn mehrere URLs aber die gleiche Domain haben, wird hier falsch ersetzt. Ich finde hierfür einfach keine Lösung:

PHP:
$var = '<a href="http://www.domain.de/test.jpg">Test</a> <a href="http://www.domain.de">Test2</a> gute Links';

preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                $var, $matches);

$matche = $matches[1];

foreach($matche as $item) {
	
	$urlNew = 'http://www.domain2.de/test.php';
    $string	= str_replace($item,$urlNew,$var);
}
var_dump($string);

Ich finde einfach keine Lösung (habe schon array absteigend nach Länge sortiert, mit Sessions zwischen gespeichert, usw.), wie ich die "http:www.domain.de" isoliert betrachten kann? Habt ihr ein Lösungsansatz?
 
hi
wie soll denn $var aussehen nach Durchlauf?

preg_replace kann so parametrisiert werden das nur der erste match ersetzt wird:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 ], ....
Edit:
und str_replace auch:
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
 
Zuletzt bearbeitet:
Am Ende solle jede URL durch "http://www.domain.de/test.php" ersetzt werden. Jedoch wird die erste URL mit "http://www.domain.de/test.php/test.jpg" ersetzt.
 
Also so:
vorher:
$var = '<a href="http://www.domain.de/test.jpg">Test</a> <a href="http://www.domain.de">Test2</a> gute Links';

Gewünscht:
$var = '<a href="http://www.domain.de/test.php">Test</a> <a href="http://www.domain.de/test.php">Test2</a> gute Links';

Da müsste es reichen, wenn man das preg_replace so ähnlich wie das aufbaut (nicht getestet):
preg_replace("/\<a.?\>/", "\<a href=''http://www.domain.de/test.php' \/\>", $var)
 
Sicher die richtige Lösung. Leider habe ich vergessen, zu erwähnen und mit aufzuschreiben, dass die $newUrl noch GET-Paremeter mit gibt, die sich bei jedem Link ändern.

Daher ist mein Fehler eher das str_replace ...
 
Moin,

was mir bei solchen Problemstellungen immer hilft, ist, praktisch als Pendant zur Wahrheitstabelle, einmal alle variablen Anteile aufzuschreiben und wie das Endprodukt aussehen soll.

Dein variabler Anteil wäre, wenn ich das richtig verstanden habe, immer nur folgendes:
<a href="http://url1/?param1=value1&param2=value2">Test</a>....<a href="https://url2/?param3=value3&param4=value4">Noch ein Test</a>

Endergebnis:
<a href="http://www.domain.de/test.php?param1=value1&param2=value2">Test</a>....<a href="http://www.domain.de/test.php?param3=value3&param4=value4">Noch ein Test</a>

So richtig?
 
Hier nochmal mein richtiger Code ... sorry. Und hier macht das str_replace-Problem.
PHP:
$var = '<a href="http://www.domain.de/test.jpg">Test</a> <a href="http://www.domain.de">Test2</a> gute Links';
 
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                $var, $matches);
 
$matche = $matches[1];

$i = 1; 

foreach($matche as $item) {
    $urlNew = 'http://www.domain2.de/test.php?id='.$i;
    $string	= str_replace($item,$urlNew,$var);
    $i++;
}
var_dump($string);
 
Wenn man ein paar echos in die foreach-schleife baut (oder einen debugger bemüht) sieht man folgendes:

aus
<a href="http://www.domain.de/test.jpg">Test</a> <a href="http://www.domain.de">Test2</a> gute Links
wird also
<a href="http://www.domain2.de/test.php?id=2/test.jpg">Test</a> <a href="http://www.domain2.de/test.php?id=2">Test2</a> gute Links

Wie soll es denn jetzt aussehen?
 
Code:
$var = '<a href="http://www.domain.de/test.jpg">Test</a> <a href="http://www.domain.de">Test2</a> gute Links';

$i =1;
$var = preg_replace_callback('/href="(.*?)"/','ersetzmich',$var);
echo $var;

function ersetzmich() {
	global $i;
	return 'href="http://www.domain2.de/test.php?id='.$i++.'"';
}
 
Zuletzt bearbeitet:
Zurück
Oben