• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

PHP Ersetzen mit Begriffen die im Ersatz auch vor kommen.

ags

New member
Lasst es mich mal so beschreiben:

Ich möchte zb die Wort ANDI und ADAM in einem string durch einen einen anderen string ersetzen, in dem ANDI und ADAM beide wieder vorkommen. Bein ersten durchlauf wird ANDI durch BRUDER_VON_ADAM ersetzt. Im zweiten Durchlauf soll das ursprüngliche ADAM durch BRUDER_VON_ANDI ersetzt werden. Der zweite durchlauf findet aber das ADAM in dem Ersatzstring BRUDER_VON_ADAM und macht daraus BRUDER_VON_BRUDER_VON_ADAM. Das ist nicht gut. Gibt es da eine Lösung?
 
Als kleine Hilfestellung: die Ersatzbegriffe stehen innerhalb <a class="highlight" href=" hier ">, was für die zu ersetztenden Begriffe niemals vor kommen kann.
 
Zuletzt bearbeitet:
Ok, hier meine Code:

PHP:
function hilite($strings,$array,$link,$query,$count = 22) {
	foreach ($array as $key) {
		$key = preg_quote($key);
		$keys[] = "#($key)#i";
	}
	return preg_replace($keys, "<a class='sr_keyword' href='$link?highlight=$query&matchnr=$count'>$0</a>", $strings);
}

Achtung: $query ist ein String der alle Elemente von $array enthält, also alle Schlüsselworte! Erst damit wird die Sache gemein.

Ich versuche mal meine Aufgabe genau zu formulieren. Vielleicht hilft das.

Ich mache eine Ausgabe eines Textes und die Begriffe "Sephiroth" und "Hitomi" sollen mit einem a Tag zwecks Verlinkung umschlossen werden. Zusätzlich soll der erzeugte Link als Parameter wiederum die Begriffe "Sephiroth" und "Hitomi" in der Form enthalten: &query=sephiroth+hitomi ... so ist das.

Als kleiner Nebeneffekt sollte auch $count bei jedem match um 1 hochgezählt werden, und gleichzeitig so in jedes replace auch schon mit eingefügt werden. $count soll auch mit einer zahl größer 0 starten können. mit preg_replace allein habe ich das durchdacht und nicht geschafft. preg_replace_callback mit einer globalen variable könnte da evtl Abhilfe schaffen?
 
Zuletzt bearbeitet:
Du machst durch Änderung deiner Beiträge ständig die Sachlage anders.
Hab im Moment keinen Bock und keine Zeit für/auf sowas.
Von meiner Seite dann vlt. morgen mehr.
 
Ich habs jetzt mal so gemacht:

PHP:
			$count = 0;

			// $strings ist ein Array aus kurzen Texten
			// $keywords ist expolde(" ",$enc_query) 
			foreach ($keywords as $key) {
				$key = preg_quote($key);
				$strings = preg_replace("#($key)#i", "<a class='sr_keyword' href='DUMMY'>$0</a>", $strings);
			}
			$link = "{$item['link']}?highlight=$enc_query&matchnr=";
			$strings = preg_replace_callback("(DUMMY)", function() {
				global $link;
				global $count;
				$count++;
				return $link.$count;
			}, $strings);

Im ersten Durchgang wird der BEGRIFF durch <a ... href="DUMMY">BEGRIFF</a> ersetzt und im zweiten wird dann jedes DUMMY mit dem link ersetzt in dem die Suchbegriffe aus dem ersten Durchlauf auch vorkommen. Ich weiß dass das ein Hack ist, wurde mir aber so empfohlen und ich habe die Kontrolle darüber welche Begriffe auf meiner Website garantiert nicht vor kommen. Durch die Verwendung einer Callback Funktion und der ernennung eines Zählers zur Globalen erhalte ich die Nummer jedes einzelnen Matches, weil der Zähler so auch über die Matchfunktion hinaus erhalten bleibt.

Falls jemand eine andere oder bessere Lösung hat, würde mich interessieren.
 
Zuletzt bearbeitet:
Ich frage mich, was die ursprüngliche Frage mit dem jetzigen Ergebnis zu tun hat
Lasst es mich mal so beschreiben:

Ich möchte zb die Wort ANDI und ADAM in einem string durch einen einen anderen string ersetzen, in dem ANDI und ADAM beide wieder vorkommen. Bein ersten durchlauf wird ANDI durch BRUDER_VON_ADAM ersetzt. Im zweiten Durchlauf soll das ursprüngliche ADAM durch BRUDER_VON_ANDI ersetzt werden. Der zweite durchlauf findet aber das ADAM in dem Ersatzstring BRUDER_VON_ADAM und macht daraus BRUDER_VON_BRUDER_VON_ADAM. Das ist nicht gut. Gibt es da eine Lösung?
Das war die Frage und das soll die Antwort sein?
Ich habs jetzt mal so gemacht:

PHP:
			$count = 0;

			// $strings ist ein Array aus kurzen Texten
			// $keywords ist expolde(" ",$enc_query) 
			foreach ($keywords as $key) {
				$key = preg_quote($key);
				$strings = preg_replace("#($key)#i", "<a class='sr_keyword' href='DUMMY'>$0</a>", $strings);
			}
			$link = "{$item['link']}?highlight=$enc_query&matchnr=";
			$strings = preg_replace_callback("(DUMMY)", function() {
				global $link;
				global $count;
				$count++;
				return $link.$count;
			}, $strings);

Im ersten Durchgang wird der BEGRIFF durch <a ... href="DUMMY">BEGRIFF</a> ersetzt und im zweiten wird dann jedes DUMMY mit dem link ersetzt in dem die Suchbegriffe aus dem ersten Durchlauf auch vorkommen. Ich weiß dass das ein Hack ist, wurde mir aber so empfohlen und ich habe die Kontrolle darüber welche Begriffe auf meiner Website garantiert nicht vor kommen. Durch die Verwendung einer Callback Funktion und der ernennung eines Zählers zur Globalen erhalte ich die Nummer jedes einzelnen Matches, weil der Zähler so auch über die Matchfunktion hinaus erhalten bleibt.

Falls jemand eine andere oder bessere Lösung hat, würde mich interessieren.
Diejenigen, die dir das empfohlen haben, Wissen mehr als wir, insofern können wir das vermutlich nicht.
 
Zurück
Oben