Seite 1 von 1

Regex - preg_replace - Problem

Verfasst: 22.06.2008, 22:19
von Wirths Media
Hallo,

ich würde gerne bestimmte Wörter in einem Text durch einen Link ersetzen, soweit kein Problem, jedoch sollen die bestehenden Links nicht verändert werden, sprich wo ein Link da nichts ersetzen, ansonsten ja.

Bsp:
Ich bin ein sinnloser <a href="/">Text</a>, der es allen anderen Texten zeigt, wie ein Text automatisch verlinkt werden kann.

Hier soll "Text" ersetzt werden aber nicht "<a href="/">Text</a>".

Gruß
Daniel

Verfasst:
von

Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

Verfasst: 24.06.2008, 23:36
von chris21
Leerzeichen vor/hinter dem zu ersetzendem Wort mit einbeziehen. Bei Links sollten diese Leerzeichen ja vor/hinter dem <a href=""> bzw. </a> kommen.

Sprich: (Unterstrich soll mal das Leerzeichen symbolisieren):

_Text_ als Suchmuster wird ersetzt durch _<a href="">Text</a>_ und dies passt dann nicht mehr aufs Suchmuster.

Verfasst: 25.06.2008, 08:17
von Wirths Media
Links sollten diese Leerzeichen
Ja, leider erstelle ich nicht den Content und deswegen kann ich mich auf sollte nicht verlassen, danke. Hab da aber auch schon was ansatzweise, wo noch die feinheiten fehlen programmiert.

Gruß
Daniel

Verfasst:
von
Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

Verfasst: 05.07.2008, 04:26
von chaoz

Code: Alles auswählen

$string = 'Dies ist ein Text. Aber <a href="sdsds">Text</a> darf nicht ersetzt werden. Nur der Text also.';
echo $string.'<br />';

$suchwort = 'Text';
$string2 = preg_replace&#40; '='. $suchwort .'&#40;?!</a>&#41;=', '<a href="123.html">'. $suchwort .'</a>', $string &#41;;

echo $string2;
sollte dein problem lösen :)

Verfasst: 06.07.2008, 17:53
von CIX88
Naja ganz so einfach ist das nicht. Wenn beim Wort Text im Link

Code: Alles auswählen

<a href="sdsds">Text</a>
noch ein Leerzeichen folgt, geht diese Variante nicht mehr. Oder es folgt noch ein Wort im Link, dann geht die Variante auch nicht mehr. Es ist einfach zu Unsicher, um wirklich ausserhalb von Links sauber zu ersetzen.

Mein Hintergedanke geht einen völligen anderen Weg, und beruht auf die Aussage:
Ja, leider erstelle ich nicht den Content und deswegen kann ich mich auf sollte nicht verlassen
Nunja, ich habe mal versucht, das ganze etwas anders zu lösen. Mein Gedanke war, man müsste erstmal alle Links raus nehmen, das gesuchte Wort dann suchen und ersetzen, und dann wieder alle vorher entfernten Links im String wieder einfügen.

Das hätte den Vorteil, dass 100%ig nie in einen Link ersetzt wird, da diese vorher schon aus dem String genommen wurden. Natürlich hat das ganze auch Nachteile. Die folgene Funktion ist nicht für Ausgaben gedacht, eher sollte man diese Funktion nur bei Eingaben machen.

Und so sieht meine Lösung aus:

Code: Alles auswählen

$string = '
Das ist eine Test-Zeile mit <a href="#">Test</a>, einen Test mit Test im 
Link <a href="#">Test</a> mit Wort Test und <a href="#">Test</a>.
';

function set_replace&#40;$suchwort, $string&#41; &#123;

	preg_match_all&#40;'~<a.*?>.*?</a>~ism', $string, $array_links, PREG_OFFSET_CAPTURE&#41;;

	$string_len = 0;
	for &#40;$i = 0; $i < count&#40;$array_links&#91;0&#93;&#41;; $i++ &#41; 
	&#123;

	$array_suche&#91;$i&#93; = $array_links&#91;0&#93;&#91;$i&#93;&#91;0&#93;;
	$array_ersatz&#91;$i&#93; = '&#91;link'.$i.'&#93;';

	$string = substr_replace&#40;
		$string, 
		$array_ersatz&#91;$i&#93;, 
		$array_links&#91;0&#93;&#91;$i&#93;&#91;1&#93; - $string_len, strlen&#40;$array_links&#91;0&#93;&#91;$i&#93;&#91;0&#93;&#41; &#41;;
	$string_len += strlen&#40;$array_links&#91;0&#93;&#91;$i&#93;&#91;0&#93;&#41; - strlen&#40;$array_ersatz&#91;$i&#93;&#41;;

	&#125;
	$string = preg_replace&#40;'~&#91;^\&#91;&#93;'.$suchwort.'&#91;^\d+\&#93;&#93;~', ' <a href="#">'.$suchwort.'</a> ', $string&#41;;
	return str_replace&#40;$array_ersatz, $array_suche, $string&#41;;
&#125;

echo set_replace&#40;'Test', $string&#41;;
Vielleicht noch eine kleine Erklärung dazu.

Zunächst werden alle Links mit preg_match_all() erfasst, und mittels PREG_OFFSET_CAPTURE die jeweilige Postion im String ermittelt.
Dies ist wichtig, falls Links doppelt sind bzw. die selben Namen oder Verweise haben.

Dann geht die Funktion den String durch und erstellt eine Art Hilfs-Array $array_suche und $array_ersatz. Anstelle der alten Links wird ein Marker mittels substr_replace() gesetzt. substr_replace() ersetzt an einer bestimmten Stelle und nicht irgendwo. Auch diese Funktion ist nötig um nicht selbe Links zu erfassen. Im Beispiel wird also aus den ersten Link ein [link0], aus den nächsten ein [link1] etc...

Jetzt kommt erst preg_replace() zum Einsatz, und sucht jetzt das gesuchte Wort, was nicht in einen Marker steht. Da die Marker von der Funktion selber erzeugt werden, können wir also bestimmen wie diese auszusehen hat. Und man kann besser darauf Einfluss nehmen, dass bestimmte Teile im String nicht ersetzt werden sollen - siehe Zitat.

Zum Schluss werden nun alle vorher entfernten Link wieder im String zurück ersetzt. Hier kommen die Hilfs-Arrays wieder zum Einsatz. Allerdings drehen wir die Array dazu um:
str_replace($array_ersatz, $array_suche, $string);

Natürlich ist dieser Weg etwas mehr als der Einzeiler mit preg_replace(), aber ich hab mal versucht das Problem von einen anderen Weg aus zu lösen.

... war jetzt so mein Gedanke ... :)