Reguläre Ausrucke - Helm brennt schon

ccgnow

Grünschnabel
Reguläre Ausdrücke - Helm brennt schon

Ich habe mir echt schon den ganzen Schädel vebrannt uns sitze hier schon den ganzen Tag dran. Habe diverse Foren durchsucht, Tuts in meinen Schädel gebrannt aber mit den Regulären Ausdrucken stehe ich echt auf Kriegsfuss.

Kurz die Basics: Ich habe eine Datenbank mit einer Tabelle wo Begriffe bzw. Keywords mit Links hinterlegt sind.

z.b. Keyword=>Tutorials/ Link=>tutorials.de
usw..

Dann habe ich meinen ganz normalen HTML Quelltext in dem ich nun die gefundenen Begrifffe (aus der Datenbank) optisch mit (bold, underline, usw...) hervorheben und verlinken möchte.

Quellcode (Snap)

HTML:
<p class=irgenwas>Hier nun der Text gefolgt von einem Begriff der nun hervorgehoben werden soll . Aber es gibt auch einen Link <a href="#">hier</a> der kommt mal vor.</p>
<h1>Hier ein Titel</h1>
<p class=nochwas>Ein weitere Text der noch einen besseren Begriff hat, aber ohne Link.</p>
<h2>Dann noch einen weiteren Titel</h2>

PHP (Snap)

Begriffe und Link kommen per Select aus der DB nach diesem Schema

PHP:
//In $r liegt mein HTML-Code den ich voher (siehe oben) aus der DB geholt habe
$r .= $result->Html;

//Daten aus DB holen
$sql = "SELECT begriff, link FROM datenbank ORDER BY begriff";
$dbh = mysql_query($sql);
$a = '0';
    
while ($row = mysql_fetch_object($dbh)) {
      $suchen[$a] = array ('suchen' => $row->begriff, 'ersetzen' => '<a href="http://'.$row->link.'" style="color: green; text-decoration:underline;">'.$row->begriff.'</a>');
$a++;
}

//Bis dahin auch keine Probleme nun aber kommen die Regs. :-)

//Jetzt Suchen u. ersetzen
for($i=0;$i<sizeof($suchen);$i++) {

  $pattern  = '/(<p [^>]*>)*'.$suchen[$i]['suchen'].'*([^<]*)(<\/p>)/';
  $r = preg_replace($pattern, '$1'.$suchen[$i]['ersetzen'].'$2$3', $r, 3);

}

return $r;

Teilweise klappt das ersetzen, oder ehrlich gesagt klappt es doch nicht. :-(

Die Regs sollen so arbeiten das der Bereich <p class=irgenwas>***</p> und <h1>**</h1> nicht berücksichtigt werden, sondern nur <p class=nochwas>***</p>. Es kann aber auch vorkommen das in dem Tag <p class=nochwas>***</p> ein Link bereits vorhanden ist der den Begriff aus der DB enthält und auch bereits verlinkt ist. Dieser sollte dann nicht nochmal ersetzt werden, währe ja doppelt gemoppelt.


Daher nun meine bitte an dich oder an euch. Ich brauche da echt schnell Hilfe und bin auch bereit dafür was locker zu machen. Wer kann mir die Regs richtig aufbauen das es alles funktioniert. Ich habe nähmlich die Geduld schon verloren. Heute war so ein schöner Tag und ich wollte eigentlich mit meinem Sohn was machen. Aber daraus wurde nix. Ich bin derzeit auf dem Kriegspfad :-)

Bitte kurze PM senden und dann klären wir den Rest. Bitte aber nur wer das wirklich drauf hat. OK
 
Zuletzt bearbeitet:
Probier mal Folgendes:
PHP:
'/(<p class=nochwas>.*?)'.preg_quote($suchen[$i]['suchen'], '/').'(.*?<\/p>)/'
Allgmein ist es jedoch schwer hierfür einen effizienten Regulären Ausdruck zu finden, der alle deine Bedingungen erfüllt.
 
Danke für deine Hilfe & Info, aber das haut nicht hin, denn wenn jetzt der Begriff schon per a Tag maskiert ist wird dieser doppelt ersetzt. Weiterhin interessiert es den Ausdruck nicht ob da nun class=Irgenwas steht, er nimmt sich alle Tags mit p vor. Komisch.

Aber noch eine andere Frage, gibt es evtl eine andere Möglichkeit wie ich das lösen könnte. Gesehen habe ich sowas schonmal. Dort wird dann allerdings über einen Layer Werbung eingebunden. Die Werbung will ich ja nicht haben, nur den Begriff hervorheben, aber vom Prinzip her ist es doch gleiche.

Hier mal ein Bild wie es sein soll.

screen.gif


Das ganze muss doch per PHP & Regs gehen. Für Anregungen und Tipps bin ich immer dankbar.
 
Zurück