subid an href url mit preg_replace anfügen ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alt match
aufruf
aufrufen
bild
code
ende
entfernen
funktion
header
match
parameter
string
tag
test
text
tip
type
url
verschiedene funktionen
zeichen
-
Hallo
ich möchte in einem HTML-tag/code">Code (String)
an alle Links (href=) eine SubId hinten an den Link anffügen.
leider bekomme ich es nicht hin mit preg_replace()
bisher versucht habe ich:
preg_replace('/href=["|\'](.*)["|\']/i', '{$1}&subid=xyz', $img_htm);
also ich will an die URL innerhalb href einen Parameter &subid=xyz anfügen
das funktioniert aber so nicht
Beispiel ...
aus einem String wie:
<br /> Tipp: <a href="ziel1.php" target="_blank">Empfehlung1</a> <br /> Tipp: <a href="ziel2.php?info=bla" target="_blank">Empfehlung2</a> <br /> Tipp: <a href='ziel3.php' target='_blank'>Empfehlung3</a>
soll sowas werden:
<br /> Tipp: <a href="ziel1.php?subid=xyz" target="_blank">Empfehlung1</a> <br /> Tipp: <a href="ziel2.php?info=bla&subid=xyz" target="_blank">Empfehlung2</a> <br /> Tipp: <a href='ziel3.php?subid=xyz' target='_blank'>Empfehlung3</a>
Problem ist auch, wenn der Link noch keine Parameter wie ?info=bla hat,
dann muss ich den SubID Parameter ja mit ? anhängen, also so ?subid=xyz
ansonsten mit &subid=xyz also einen URL-GET-Patameter hinzufügen
ausserdem soll es für Links funktionieren die mit href="..." oder href='...' geschrieben sind
also egal ob einfaches oder doppeltes Anführungszeichen (oder auch gar keins?)
jemand ne Idee, wie ich das angehen soll ?!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Meinst du so etwas:
<?php header('content-type: text/plain'); $text = <<< ETX <br /> Tipp: <a href="ziel1.php" target="_blank">Empfehlung1</a> <br /> Tipp: <a href="ziel2.php?info=bla" target="_blank">Empfehlung2</a> <br /> Tipp: <a href='ziel3.php' target='_blank'>Empfehlung3</a> <br /> Mail: <a href='mailto:x@y' target='_blank'>bleibt wie es ist</a> ETX; $pattern = '/<a (.*)href=([\'"])(.+)\\2([^>]*)>(.*)<\/a>/iU'; $SUBID = 'xyz'; function callback($match) { global $SUBID; $url = $match[3]; if(strpos($url, 'mailto:') !== false) return $match[0]; $url .= ((strpos($url, '?') === false) ? '?' : '&') . "subid=$SUBID"; return "<a {$match[1]}href={$match[2]}$url{$match[2]}{$match[4]}>{$match[5]}</a>"; } $text = preg_replace_callback($pattern, 'callback', $text); echo($text);
Ausgabe:<br /> Tipp: <a href="ziel1.php?subid=xyz" target="_blank">Empfehlung1</a> <br /> Tipp: <a href="ziel2.php?info=bla&subid=xyz" target="_blank">Empfehlung2</a> <br /> Tipp: <a href='ziel3.php?subid=xyz' target='_blank'>Empfehlung3</a> <br /> Mail: <a href='mailto:x@y' target='_blank'>bleibt wie es ist</a>
Beitrag zuletzt geändert: 1.4.2013 15:23:47 von hackyourlife -
Super, vielen Dank
das funktioniert soweit schon ganz gut, jetzt habe ich aber noch das Problem,
wenn in der URL schon eine &subid=yyyyy drin ist,
dann wird mit dem Code oben nochmal &subid=xyz dazu angehängt
zudem möchte ich das Ergebnis valide für XHTML 1.0 Transitional haben
bisher habe ich
+ das mit den & anstatt nur & in URL Parameter
+ und dem Close IMG Tag mit Slash am Ende />
+ und wenn fehlendes alt="" in IMG Tag einfügen
- aber "falsche" subids werden nicht ersetzt ?
habe ich jetzt so gemacht:
<?php // -------------------------------------------------------------- header("Content-Type: text/html; charset=utf-8"); // -------------------------------------------------------------- $text = ' <br /> Test1 <a href="test123.php?subid=zzz&aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"></a> <br /> Test2 <a href="test456.php?x=yyy&subid=xxxxx"><img src="bild456.jpg" /></a> <br /> Test3 <a href=\'test789.php\'><img src=\'bild789.jpg\' border=\'0\'></a> '; $pattern = '/<a (.*)href=([\'"])(.+)\\2([^>]*)>(.*)<\/a>/iU'; $SUBID = 'xyz'; function match_callback($match) { global $SUBID; ## print "<br /> DEBUG \$match \n"; ## print "<pre style=\"background:#DEDEDE;\">".htmlentities(print_r($match,true))."</pre>\n"; ## print "<br />\n"; $url = $match[3]; if(strpos($url, 'mailto:') !== false) { $out = $match[0]; } else { if (strpos($url,'subid=') === false) { $url .= ((strpos($url, '?') === false) ? '?' : '&') . 'subid='.$SUBID.''; } else { $url = preg_replace('/subid=(.+)([\'" &])/iU', 'subid='.$SUBID.'\\2', $url); } if (!preg_match('/<img(.*)(\/)>/Ui', $match[5])) { $match[5] = str_replace('>','/>',$match[5]); } if (!preg_match('/alt=/Ui', $match[5])) { $match[5] = str_replace('/>',' alt="" />',$match[5]); } $out = "<a {$match[1]}href={$match[2]}$url{$match[2]}{$match[4]}>{$match[5]}</a>"; $out = preg_replace('/ {2,}/', ' ', $out); $out = str_replace('&','&',$out); $out = str_replace('&amp;','&',$out); } return $out; } // -------------------------------------------------------------- $text_new = preg_replace_callback($pattern, 'match_callback', $text); // -------------------------------------------------------------- print "<br />\n"; print "<br /> Vorher: \n"; print "<br />\n"; print "<pre>".htmlentities(print_r($text,true))."</pre>\n"; print "<br />\n"; print "<br /> Nachher: \n"; print "<br />\n"; print "<pre>".htmlentities(print_r($text_new,true))."</pre>\n"; print "<br />\n"; print "<br />\n"; print "<br />\n"; // -------------------------------------------------------------- ?>
die Ausgabe ist
Vorher: <br /> Test1 <a href="test123.php?subid=zzz&aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"></a> <br /> Test2 <a href="test456.php?x=yyy&subid=xxxxx"><img src="bild456.jpg" /></a> <br /> Test3 <a href='test789.php'><img src='bild789.jpg' border='0'></a> Nachher: <br /> Test1 <a href="test123.php?subid=zzz&aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"/></a> <br /> Test2 <a href="test456.php?x=yyy&subid=xxxxx"><img src="bild456.jpg" alt="" /></a> <br /> Test3 <a href='test789.php?subid=xyz'><img src='bild789.jpg' border='0' alt="" /></a>
soweit ja ganz OK ... bis auf das nicht Ersetzen der "falschen" subids
ich verstehe nicht warum das nicht funktioniert:
// --------------------------- if (strpos($url,'subid=') === false) { $url .= ((strpos($url, '?') === false) ? '?' : '&') . 'subid='.$SUBID.''; } else { $url = preg_replace('/subid=(.+)([\'" &])/iU', 'subid='.$SUBID.'\\2', $url); } // ---------------------------
.... EDIT ....
?!? komisch, wenn ich das auf den kompletten HTML anwende, nicht auf die url, dann geht's ?!?
$text_new = preg_replace_callback($pattern, 'match_callback', $text); $text_new = preg_replace('/subid=(.+)([\'" &])/iU', 'subid='.$SUBID.'\\2', $text_new);
dann werden "falsche" subids zu meiner "xyz" ersetzt ... ?
<br /> Test1 <a href="test123.php?subid=xyz&aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"/></a> <br /> Test2 <a href="test456.php?x=yyy&subid=xyz"><img src="bild456.jpg" alt="" /></a> <br /> Test3 <a href='test789.php?subid=xyz'><img src='bild789.jpg' border='0' alt="" /></a>
hä? ... warum geht das an der Stelle aber nicht bei Anwendung auf $url ... ?
... EDIT 2 ...
weil die $url nach dem Wert von subid= ggf. kein Zeichen mehr besitzt, das aber im Pattern verlant wird.
so gehts dann doch:
// --------------------------- if (strpos($url,'subid=') === false) { $url .= ((strpos($url, '?') === false) ? '?' : '&') . 'subid='.$SUBID.''; } else { $url .='"'; $url = preg_replace('/subid=(.+)([\'" &])/iU', 'subid='.$SUBID.'\\2', $url); $url = rtrim($url,'"'); } // ---------------------------
einfach ein Zeichen an $url dran hängen,
dann preg_replace laufen lassen und
dann das angehängte Zeichen dann wieder entfernen
:) ... oOo ...
Beitrag zuletzt geändert: 2.4.2013 11:58:46 von wgames -
wgames schrieb:
Immer noch nicht perfekt. Ich habe meine Version noch einmal überarbeitet, das sollte jetz all das machen was du dir wünscht, ohne irgendwelchen hässlichen Umwegen:
einfach ein Zeichen an $url dran hängen,
dann preg_replace laufen lassen und
dann das angehängte Zeichen dann wieder entfernen<?php header('content-type: text/plain'); $text = <<< ETX <br /> Tipp: <a href="ziel1.php" target="_blank">Empfehlung1</a> <br /> Tipp: <a href="ziel2.php?info=bla" target="_blank">Empfehlung2</a> <br /> Tipp: <a href='ziel3.php' target='_blank'>Empfehlung3</a> <br /> Mail: <a href='mailto:x@y' target='_blank'>bleibt wie es ist</a> <br /> Test1 <a href="test123.php?subid=zzz&aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"></a> <br /> Test2 <a href="test456.php?x=yyy&subid=xxxxx"><img src="bild456.jpg" /></a> <br /> Test3 <a href='test789.php'><img src='bild789.jpg' border='0'></a> <br /> Test4 <a href='ziel4.php?x=yyy&subid=nnn&aaa=bbb' target='_blank'>Test!</a> <br /> Test5 <a href='ziel5.php?x=yyy&subid=nnn&aaa=bbb' target='_blank'>Test!</a> <br /> Test6 <a href='ziel6.php?x=yyy&mysubid=nnn&aaa=bbb' target='_blank'>Test!</a> ETX; $link = '/<a (.*)href=([\'"])(.+)\\2([^>]*)>(.*)<\/a>/iU'; $image = '|<img (.+?)([/]?)>|i'; $SUBID = 'xyz'; function linkcallback($match) { global $SUBID; $url = str_replace('&', '&', $match[3]); if(strpos($url, 'mailto:') !== false) return $match[0]; $oldurl = $url; $url = preg_replace('/([?&])subid=([^&]+)/i', "\\1subid=$SUBID", $url); if($oldurl == $url) $url .= ((strpos($url, '?') === false) ? '?' : '&') . "subid=$SUBID"; $url = str_replace('&', '&', $url); return "<a {$match[1]}href={$match[2]}$url{$match[2]}{$match[4]}>{$match[5]}</a>"; } function imagecallback($match) { $body = trim($match[1]); if(strpos($body, ' alt=') === false) $body .= ' alt=""'; return "<img $body />"; } $text = preg_replace_callback($link, 'linkcallback', $text); $text = preg_replace_callback($image, 'imagecallback', $text); echo($text);
-
vielen Dank, das ist Spitze !!!
ich habe das jetzt aber noch in einen einzelnen Funktions-Aufruf zusammen geführt
iden ich einfach die img Prüfung mit in die linkcallback() Funktion am Ende rein habe.
// ---------------------------------------------------- function linkcallback($match) { global $SUBID; $url = str_replace('&', '&', $match[3]); if(strpos($url, 'mailto:') !== false) return $match[0]; $oldurl = $url; $url = preg_replace('/([?&])subid=([^&]+)/i', "\\1subid=$SUBID", $url); if($oldurl == $url) { $url .= ((strpos($url, '?') === false) ? '?' : '&') . "subid=$SUBID"; } $url = str_replace('&', '&', $url); // ---------------------- if (preg_match('|<img (.+?)([/]?)>|i', $match[5], $imgmatch)) { $imgbody = trim($imgmatch[1]); if(strpos($imgbody, ' alt=') === false) { $imgbody .= ' alt=""'; } $match[5] = "<img $imgbody />"; } // ---------------------- return "<a {$match[1]}href={$match[2]}$url{$match[2]}{$match[4]}>{$match[5]}</a>"; } // ----------------------------------------------------
so muss ich nicht 2 verschiedene Funktionen aufrufen .... :=)
DANKE !!!
-
wgames schrieb:
Damit veränderst du aber ebenfalls die Funktionsweise… der wichtige Unterschied ist, dass dann nur noch Bilder innerhalb von Links "verbessert" werden, und hierbei auch nur das erste Bild im Link.
ich habe das jetzt aber noch in einen einzelnen Funktions-Aufruf zusammen geführt
iden ich einfach die img Prüfung mit in die linkcallback() Funktion am Ende rein habe.
[…]
so muss ich nicht 2 verschiedene Funktionen aufrufen .... :=)
Bei meiner Version hingegen werden alle Bilder im gesamten Dokument "verbessert".
Welche der beiden Version du haben willst musst du wissen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage