preg_replace-Problem
-
Hallo.
Kleine Denksport-Aufgabe:
Ich möchte innerhlab von /* ... */ alle ' durch die dezimale Entität (') ersetzezn.
Dazu verwende ich folgenden Code:$string = "/* It's a comment */"; $string = preg_replace("#/\*(.*?)'(.*)\*/#si","/*\\1'\\2*/",$string);
der Code ersetzt auch brav alle ' durch die Entität, nur leider auch außerhalb der (offensichtlichen ) Kommentare.
Der betreffende Code liegt hier vor.
Einfach etws runterscrollen, oben ist der Original-Code, unten der geparste. Ban beachte dort bitte die Zeile:switch (c) { case '\n':
Dort wird fälschlicherweise auch das erste ' ersetzt.
Das Ersetzen erfolgt im Ganzen durch diesen Code:
<html> <head> <title>Test des MSH-Mods BETA #3</title> <style type="text/css"> <!-- .comment {color:#008000} .string {color:#FF0000} .keyword {color:#0000FF} .number {color:#008080} .comment .string {color:#008800} .comment .keyword {color:#008800} .comment .number {color:#008800} .string .comment {color:#FF0000} .string ,keyword {color:#FF0000} .string .number {color:#FF0000} --> </style> </head> <body> <?php //lädt den Quellcode aus einer Datei function loadfile($filename) { $file = fopen($filename,"r"); $size = filesize($filename); $content = fread($file,$size); fclose($file); return $content; } function parse($string,$lang) { global $syntax,$span; // empty string, so don't bother if(strlen($string) == 0) return $string; $string = preg_replace("#/\*(.*?)\*/#si","<span class=|comment|>/*\\1*/</span>",$string); $string = preg_replace("#/\*(.*?)'(.*?)\*/#si","/*\\1'\\2*/",$string); $string = str_replace("class=|comment|","class='comment'",$string); $string = str_replace("class=|string|","class='string'",$string); return $string; } $code = loadfile("test_source.txt"); // Sonderzeichen ersetzen (by phpBB) $code_entities_match = array('#<#', '#>#', '#"#', '#:#', '#[#', '#]#', '#\(#', '#\)#', '#\{#', '#\}#'); $code_entities_replace = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}'); $code = preg_replace($code_entities_match, $code_entities_replace, $code); //"Vorschau" echo "<pre>".nl2br($code)."</pre><hr>"; $code = parse($code,"cpp"); //Ergebnis echo "<pre>".nl2br($code)."</pre><hr>"; ?> </body> </html>
Und jetzt kommt's: Wo ist der Fehler? Wahrscheinlich irgendwo im preg_replace ...
Bye.