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('&lt;', '&gt;', '&quot;', ':', '[', ']', '(', ')', '{', '}');
       $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.


Anmelden zum Antworten