Pregunta

Quiero analizar un archivo y quiero usar php y regex para eliminar:

  • líneas en blanco o vacías
  • comentarios de una sola línea
  • comentarios de varias líneas

básicamente quiero eliminar cualquier línea que contenga

/* text */ 

o comentarios de varias líneas

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

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

¿Es eso posible? ¿Alguien puede publicarme una expresión regular que haga exactamente eso?

Muchas gracias.

¿Fue útil?

Solución

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

Otros consejos

Tenga en cuenta que cualquier expresión regular que use fallará si el archivo que está analizando tiene una cadena que contiene algo que coincide con estas condiciones. Por ejemplo, convertiría esto:

print "/* a comment */";

En esto:

print "";

Que probablemente no sea lo que quieres. 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 de PCRE modernas han agregado varios hacks para que sean capaces de hacer esto y, lo que es más importante, ya no sean expresiones regulares , sino lo que sea. Si desea evitar quitar estas cosas entre comillas o en otras situaciones, no hay sustituto para un analizador completo (aunque todavía puede ser bastante simple).

//  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);

Es posible, pero no lo haría. Debe analizar todo el archivo php para asegurarse de que no está eliminando ningún espacio en blanco necesario (cadenas, espacios en blanco entre palabras clave / identificadores (publicfuntiondoStuff ()), etc.). Utilice mejor la extensión del tokenizer de PHP.

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

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

Esta es mi solución, si no se usa una para regexp. El siguiente código elimina todos los comentarios delimitados por # y recupera los valores de la variable en este estilo NAME = VALUE

  $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);
}

¡Esta 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 usando esta función 'strip_comments' para pasar el código contenido 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);
?>

Producirá resultados como

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

Cargando desde un archivo php:

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

echo htmlspecialchars($code);
?>

Cargando un archivo php, quitando comentarios y guardándolo 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

Encontré este que me conviene mejor, (\ s +) \ / \ * ([^ \ /] *) \ * / \ n * elimina multilínea, con pestañas o no comentarios y el espacio detrás de él. Dejaré un ejemplo de comentario con el que coincidiría esta expresión regular.

/**
 * The AdditionalCategory
 * Meta informations extracted from the WSDL
 * - minOccurs : 0
 * - nillable : true
 * @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
 */
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top