kostenloser Webspace werbefrei: lima-city


subid an href url mit preg_replace anfügen ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    wgames

    wgames hat kostenlosen Webspace.

    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 ?!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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
  4. Autor dieses Themas

    wgames

    wgames hat kostenlosen Webspace.

    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 &amp; 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) ? '?' : '&amp;') . '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('&','&amp;',$out); 
    		$out = str_replace('&amp;amp;','&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&amp;aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"/></a>
    <br /> Test2 <a href="test456.php?x=yyy&amp;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) ? '?' : '&amp;') . '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&amp;aaa=bbb"><img src="bild123.jpg" alt="Info / Test" border="0"/></a>
    <br /> Test2 <a href="test456.php?x=yyy&amp;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) ? '?' : '&amp;') . '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
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    wgames schrieb:
    einfach ein Zeichen an $url dran hängen,
    dann preg_replace laufen lassen und
    dann das angehängte Zeichen dann wieder entfernen
    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:
    <?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&amp;subid=nnn&aaa=bbb' target='_blank'>Test!</a>
    <br /> Test6 <a href='ziel6.php?x=yyy&amp;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('&amp;', '&', $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('&', '&amp;', $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);
  6. Autor dieses Themas

    wgames

    wgames hat kostenlosen Webspace.

    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('&amp;', '&', $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('&', '&amp;', $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 !!!
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    wgames schrieb:
    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 .... :=)
    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.
    Bei meiner Version hingegen werden alle Bilder im gesamten Dokument "verbessert".

    Welche der beiden Version du haben willst musst du wissen.
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!