S
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.