PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suchen/Ersetzen: Alles erstzen nur nicht in HTML Tags


norial
20.04.2004, 17:37:27
Hallo,

in einem HTML Text $text ersetze ich mit:


function highlight($text,$words) {
$words = split(':',$words); // Übergabe wort1:wort2... $color=array("6666ff","BDB76B","90EE90","FA8072","EE82EE","9ACD3","ADD8E6"); // 7 Farben müssen reichen
for($i = 0; $i < sizeof($words); $i++) {
$text=preg_replace ("/$words[$i]/is", "%öüöäßüäö%#".$color[$i]."'>%äöüßüöä%", $text); // erst mit dummies ersetzen - verhindert mehrfach Ersetzungen
}
$text=preg_replace ("/%öüöäßüäö%#/is", "<span style='background-color: #", $text); // dummies austauschen $text=preg_replace ("/%äöüßüöä%/is", "</span>", $text);
return $text; }


alle Wörter in $words mit <span>Word</span> zum Hervorheben.
Leider kann es vorkommen, dass Links o.ä. zerstört werden.
Bsp:

Beispieltext <a href='http://diesisteinBeispiellink.de'>test</a>


Wenn ich 'ein' ersetze zerstöre ich den Link und es kommt raus.

Beispieltext <a href='http://diesist<span>ein</span>Beispiellink.de'>test</a>


Hat jemand eine elegante Lösung, wie ich solche Ersetzungen verhindere.

Grüße und danke

Beamer
21.04.2004, 22:39:10
Elegant nicht gerade, aber etwas getrickst:

Du erstellt eine eigene Suchen/Ersetzen-Funktion. Dabei durchsuchst du den String von Anfang an, Zeichen für Zeichen. Triffst du auf ein HTML-Tag, setzt du einen Zähler hoch bzw. auch wieder runter. Nur wenn der Zähler auf 0 ist, sich der gesuchte Text also außerhalb eines HTML-Tags befindet, darf ersetzt werden. Das setzt natürlich einen sauberen HTML-Code voraus. (Achte auch auf Tags ohne Abschluss-Tag wie <br>.)


Übrigens: Für deine Ersetzen-Version hätte es auch die Funktion strtr getan. Du hättest ein Array mit Elementen der Form "Wort1" => "<span ...>Wort1</span>" aufgebaut und mit strtr auf einmal ersetzt. Aber wie gesagt, ist nur eine Alternative zu deinem und löst nicht das "HTML-Problem".

Progman
22.04.2004, 10:29:38
8.11. Wie ersetze ich in einem Text, jedoch nicht innerhalb von HTML-Tags?
http://www.dclp-faq.de/q/q-regexp-ersetzen.html

reincom.de
11.03.2011, 17:30:21
Hallo Leute,

ich hoffe ihr könnt mir helfen, leider komme ich nicht weiter.

Um bestimmte Wörter in einem Text zu ersetzen, durchläuft eine Schleife einzeln alle Schlüsselwörter und ersetzt diese gegebenenfalls mit folgendem Code-Fragment:

$text = preg_replace("/{$row->keyword}/", "<b>{$row->keyword}</b>", $text, 1);

Dies macht im Prinzip genau das was es soll, nur wenn ein Link im Text vorkommt, wird dieser LEIDER auch ersetzt.

Nun habe ich folgenden Code im Internet und hier gefunden:

preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<b>\1</b>"', $t);

Jetzt wird zwar der Link nicht mehr ersetzt, aber es kommt zu:

<b>LAN</b>, <b>MAN</b>, <b>WAN</b>, <b>W<b>LAN</b></b>

Was ich nicht verstehe ist:

<b> müsste doch auch mit (<[^>]*) abgefangen werden.
Es werden nun alle Vorkommen ersetzt. Es sollte aber nur das 1. Vorkommen ersetzt werden, was ich mit der 1 am Ende meines preg_replace erreicht habe. Bei eurer Variante kommt es zu keiner Ausgabe mehr.
Wie kann ich es richtig machen?




/**
* Der übergebene Text wird nach Keywords durchsucht und gegebenenfalls
* mit den HTML-Tags "abbr" bzw. "acronym" erweitert.
*
* @param string $text
* @return string
*/
public function parse($text) {
$sql = sprintf("SELECT keyword, abbr, title
FROM %s WHERE activ=1 ORDER BY keyword DESC",
$this->_tablename
);
$result = $this->_db->query($sql);

if (true == $result && $result->num_rows >= 1) {
while ($row = $result->fetch_object()) {
if (true == $row->abbr) {
$replacement = '<abbr title="' . $row->title . '">'.$row->keyword.'</abbr>';
} else {
$replacement = '<acronym title="' . $row->title . '">'.$row->keyword.'</acronym>';
}
// Hyperlinks werden LEIDER mit ersetzt
//$text = preg_replace("/{$row->keyword}/", $replacement, $text, 1);

// Quelle: http://www.php-faq.de/q-regexp-ersetzen.html
$text = preg_replace("/((<[^>]*)|{$row->keyword})/e", '"\2"=="\1"? "\1":"$replacement"', $text);
}
$result->close();
}
return $text;
}


Vielen Dank für eure Hilfe.

Andreas