2009-03-13 22 views
19

Quiero analizar un archivo y quiero usar php y expresiones regulares para despojar a:expresión regular para despojar a los comentarios y observaciones de varias líneas y líneas vacías

  • líneas en blanco o vacíos
  • sola línea comenta
  • de múltiples líneas comenta

básicamente quiero eliminar cualquier línea que contiene

/* text */ 

o de múltiples líneas comenta

/*** 
some 
text 
*****/ 

Si es posible, otra expresión regular para comprobar si la línea está vacía (Eliminar líneas en blanco)

¿Es posible? ¿alguien puede enviarme una expresión regular que haga exactamente eso?

Muchas gracias.

+0

relacionadas: http://stackoverflow.com/questions/503871/best-way-to-automatically-remove -comments-from-php-code – user956584

Respuesta

41
$text = preg_replace('!/\*.*?\*/!s', '', $text); 
$text = preg_replace('/\n\s*\n/', "\n", $text); 
+0

¡Muchas gracias! La primera expresión regular eliminó los comentarios de una sola línea. Sin embargo, la segunda expresión regular no cambió y no eliminó los comentarios de varias líneas. Agradezco su respuesta ... gracias de nuevo –

+0

Asegúrese de tener los! S en la primera expresión regular; no fue en mi respuesta inicial. Eso es lo que lo hace manejar los comentarios de líneas múltiples. El segundo patrón elimina las líneas vacías. – chaos

+0

The! S lo hace funcionar al 100%. Funciona mucho mejor que mi expresión regular, +1 de mí. –

10

Tenga en cuenta que cualquier expresión regular se utiliza fallará si el archivo que está de análisis tiene una cadena que contiene algo que coincida con estas condiciones. Por ejemplo, sería convertir esto:

print "/* a comment */"; 

En esto:

print ""; 

que es probablemente no lo que quiere. Pero tal vez lo sea, no lo sé. De todos modos, las expresiones regulares técnicamente no pueden analizar los datos de una manera para evitar ese problema. Digo técnicamente porque las expresiones regulares PCRE modernas han añadido varios hacks para que sean capaces de hacer esto y, lo que es más importante, ya no tienen expresiones regulares, sino lo que sea. Si desea evitar eliminar estas cosas dentro de comillas o en otras situaciones, no hay sustituto para un analizador completo (aunque puede ser bastante simple).

2

Es es posible, pero yo no lo haría. Debe analizar todo el archivo php para asegurarse de no eliminar los espacios en blanco necesarios (cadenas, espacios en blanco entre palabras clave/identificadores (publicfuntiondoStuff()), etc.). Mejor uso el tokenizer extension de PHP.

+0

Quiero contar solo con expresiones regulares. El archivo es muy simple, tiene un par de comentarios de una sola línea, comentarios de varias líneas y algunos códigos PHP (cada uno en una nueva línea). Solo quiero una fórmula de expresiones regulares que haga una limpieza ... para que pueda usar la salida en el navegador para diferentes usos. –

+0

Tenga en cuenta que el enfoque exclusivo de expresiones regulares omitirá "aquí documentos". Para identificar correctamente ese texto, realmente necesita usar un tokenizador. – Peter

1

Esto debería funcionar para reemplazar todo/* a * /.

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string); 
+0

Apreciar tu ayuda también. ¡Gracias! –

2
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string); 
0

Esta es mi solución, si no se está acostumbrado a expresión regular. El siguiente código Retire todo el comentario delimitado por # y recupera los valores de la variable en este estilo NOMBRE = VALOR

$reg = array(); 
    $handle = @fopen("/etc/chilli/config", "r"); 
    if ($handle) { 
    while (($buffer = fgets($handle, 4096)) !== false) { 
    $start = strpos($buffer,"#") ; 
    $end = strpos($buffer,"\n"); 
    // echo $start.",".$end; 
     // echo $buffer ."<br>"; 



    if ($start !== false) 

     $res = substr($buffer,0,$start); 
    else 
     $res = $buffer; 
     $a = explode("=",$res); 

     if (count($a)>0) 
     { 
      if (count($a) == 1 && !empty($a[0]) && trim($a[0])!="") 
       $reg[ $a[0] ] = ""; 
      else 
      { 
       if (!empty($a[0]) && trim($a[0])!="") 
        $reg[ $a[0] ] = $a[1]; 
      } 
     } 




    } 

    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 
} 
0

Ésta es una buena función, y funciona!

<? 
if (!defined('T_ML_COMMENT')) { 
    define('T_ML_COMMENT', T_COMMENT); 
} else { 
    define('T_DOC_COMMENT', T_ML_COMMENT); 
} 
function strip_comments($source) { 
    $tokens = token_get_all($source); 
    $ret = ""; 
    foreach ($tokens as $token) { 
     if (is_string($token)) { 
      $ret.= $token; 
     } else { 
      list($id, $text) = $token; 

      switch ($id) { 
      case T_COMMENT: 
      case T_ML_COMMENT: // we've defined this 
      case T_DOC_COMMENT: // and this 
       break; 

      default: 
       $ret.= $text; 
       break; 
      } 
     } 
    }  
    return trim(str_replace(array('<?','?>'),array('',''),$ret)); 
} 
?> 

Ahora, utilizando esta función 'strip_comments' para el código que pasa contenida en alguna variable:

<? 
$code = " 
<?php 
    /* this is comment */ 
    // this is also a comment 
    # me too, am also comment 
    echo "And I am some code..."; 
?>"; 

$code = strip_comments($code); 

echo htmlspecialchars($code); 
?> 

dará como resultado la salida como

<? 
echo "And I am some code..."; 
?> 

se carga de un archivo PHP:

<? 
$code = file_get_contents("some_code_file.php"); 
$code = strip_comments($code); 

echo htmlspecialchars($code); 
?> 

Loadi ng un archivo PHP, despojando a los comentarios y guardar de nuevo

<? 
$file = "some_code_file.php" 
$code = file_get_contents($file); 
$code = strip_comments($code); 

$f = fopen($file,"w"); 
fwrite($f,$code); 
fclose($f); 
?> 

Fuente: http://www.php.net/manual/en/tokenizer.examples.php

+0

Esto funciona genial. Pero hay un problema: no elimina las líneas vacías de donde se eliminan los comentarios. Si un archivo contiene 500 líneas de comentarios, se eliminarán las palabras, pero las líneas vacías seguirán allí. ¿Puede decirnos la forma correcta de eliminar estas líneas vacías? –

+0

Como resultado, solicite junto a eliminar líneas vacías: preg_replace ('/ \ n \ s * \ n /', '', $ code) o al lado para eliminar solo las líneas vacías de inicio: preg_replace ('/^\ n \ s * \ n/',' ', $ code) –

4
// Removes multi-line comments and does not create 
// a blank line, also treats white spaces/tabs 
$text = preg_replace('!^[ \t]*/\*.*?\*/[ \t]*[\r\n]!s', '', $text); 

// Removes single line '//' comments, treats blank characters 
$text = preg_replace('![ \t]*//.*[ \t]*[\r\n]!', '', $text); 

// Strip blank lines 
$text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $text); 
+1

La sustitución de comentario de una sola línea no funciona cuando hay URL involucradas. 'https: // example.com' también se reemplaza. – ascx

Cuestiones relacionadas