RegEx Problem

Sebastian Wramba

Erfahrenes Mitglied
Hallo zusammen,

für mein kleines Highlight-Script wollte ich den Inhalt zwischen ' und ' parsen lassen, sowie Klammern und eckige Klammern. Jedoch mit der Bedingung, dass diese nicht auskommentiert sein dürfen (durch // oder { ... } oder (* ... *) ) ...

Funktioniert mit bestimmten Wörtern auch schon, wenn ich das jedoch entsprechend anpasse, geht's lustigerweise nicht mehr, d.h. er parsed nirgendwo Klammern, eckige Klammern oder Strings.

Code:
// Zum Parsen von bestimmten Wörtern

<?php
if(!preg_match("~(//(.*)(".$fw."))|(\{(.*)(".$fw.")(.*)\})|(\(\*(.*)(".$fw.")(.*)\*\))~iU",$return_string)) {   // Überprüfen, ob kein Kommentar
    $return_string = preg_replace("/(^|;|:|\(|\)|\s)(".$fw.")(\$|;|:|\(|\)|\s)/isU","$1<b>$2</b>$3",$return_string);
   }   
?>


Code:
// Zum Parsen von '...' und (, ), [  und ]
<?php
if(!preg_match("~(//(.*)('|\(|\)))|(\{(.*)('|\(|\))(.*)\})|(\(\*(.*)('|\(|\))(.*)\*\))~iU",$return_string)) {
  $return_string = preg_replace("/'(.*)'/isU","<span style=\"color:#FF0000\">'$1'</span>",$return_string); // Strings
  $return_string = preg_replace("/(\(|\))/isU","<span style=\"color:#007700\">$1</span>",$return_string);
 }
?>

Anm.: Das Pattern ist laut RegEx Coach richtig, der springt auch bei Kommentaren drauf an. Und wenn ich die if-Abfrage rausnehme, wird alles richtig geparsed, jedoch mit nicht mehr.
Ich hoffe, mir kann jemand hierbei helfen.
Danke im Voraus, Sebastian
 
Zuletzt bearbeitet:
Hallo....

das Problem ist, dass wenn die Abfrage nicht zutrifft,...also irgendwo innerhalb des Strings ein Kommentar gefunden wurde, der komplette String nicht
geparst wird.

Falls innerhalb des kompletten Strings normalerweise keine Tags vorkommen können(vom Highlightning mal abgesehen)...
könntest du erst mal alles pauschal nach Belieben highlighten.

Im Anschluss daran könntest du dann nach Kommentaren suchen und aus diesen wieder die Tags entfernen.
Code:
<?php
$return_string="Text mit bla und 'Strings'
und //'Kommentaren' und
noch 'mehr' (*['Kommentaren']*)
und vielen (Klammern) und noch mehr {(Kommentaren)} und bestimmten BLA-Wörtern
und [eckigen Klammern 'ohne' Kommentar] und einem blubb";

$words=array('bla','blubb');
foreach($words as $key=>$fw)
    {
    //bestimmte Wörter
    $return_string=preg_replace("/(\b)(".$fw.")(\b)/isU","\\1<b>\\2</b>\\3",$return_string);
    }
    
    //'...'
    $return_string=preg_replace("/'(.*)'/sU","<span style=\"color:#FF0000\">'\\1'</span>",$return_string);
    
    //Klammern
    $return_string=preg_replace("/(\[|\]|\((?!\*)|(?<!\*)\))/s","<span style=\"color:silver\">\\1</span>",$return_string);
    
    //Highlight aus Kommentar enftfernen
    $return_string=preg_replace("/(\/\/.*[\r\n]|\(\*.*\*\)|\{.*\})/seU","strip_tags('\\1')",$return_string);

echo '<pre>'.$return_string.'</pre>';
?>

Falls du doch Tags im String hast, könntest du ja einstweilen erstmal statt der Highlight-Tags mit irgendwelchen Platzhaltern arbeiten....
dann diese entfernen und am Ende die restlichen Platzhalter durch deine Tags erstzen.
 
Zurück