usar trucos strip_tags remove que puede practicas para optimizar listos hacer ejemplo con codigos codigo buenas php comments strip

trucos - La mejor manera de eliminar automáticamente los comentarios del código PHP



strip_tags php ejemplo (11)

¿Qué hay de usar php -w para generar un archivo sin comentarios y espacios en blanco, y luego usar un embellecimiento como PHP_Beautifier para reformatearlo y poder PHP_Beautifier ?

¿Cuál es la mejor manera de eliminar comentarios de un archivo PHP?

Quiero hacer algo similar a strip-whitespace (), pero tampoco debería eliminar los saltos de línea.

P.EJ:

Quiero esto:

<?PHP // something if ($whatsit) { do_something(); # we do something here echo ''<html>Some embedded HTML</html>''; } /* another long comment */ some_more_code(); ?>

convertirse:

<?PHP if ($whatsit) { do_something(); echo ''<html>Some embedded HTML</html>''; } some_more_code(); ?>

(Aunque si las líneas vacías permanecen donde se eliminan los comentarios, eso no estaría bien).

Puede que no sea posible, debido al requisito de conservar html incrustado, eso es lo que ha hecho tropezar las cosas que han aparecido en google.


Aquí está la función publicada arriba, modificada para eliminar recursivamente todos los comentarios de todos los archivos php dentro de un directorio y todos sus subdirectorios:

function rmcomments($id) { if (file_exists($id)) { if (is_dir($id)) { $handle = opendir($id); while($file = readdir($handle)) { if (($file != ".") && ($file != "..")) { rmcomments($id."/".$file); }} closedir($handle); } else if ((is_file($id)) && (end(explode(''.'', $id)) == "php")) { if (!is_writable($id)) { chmod($id,0777); } if (is_writable($id)) { $fileStr = file_get_contents($id); $newStr = ''''; $commentTokens = array(T_COMMENT); if (defined(''T_DOC_COMMENT'')) { $commentTokens[] = T_DOC_COMMENT; } if (defined(''T_ML_COMMENT'')) { $commentTokens[] = T_ML_COMMENT; } $tokens = token_get_all($fileStr); foreach ($tokens as $token) { if (is_array($token)) { if (in_array($token[0], $commentTokens)) { continue; } $token = $token[1]; } $newStr .= $token; } if (!file_put_contents($id,$newStr)) { $open = fopen($id,"w"); fwrite($open,$newStr); fclose($open); }}}}} rmcomments("path/to/directory");



El problema es que un algoritmo de coincidencia menos robusto (regex simple, por ejemplo) comenzará a despojarse aquí cuando claramente no debería:

if (preg_match(''#^/*'' . $this->index . ''#'', $this->permalink_structure)) {

Puede que no afecte tu código, pero eventualmente alguien obtendrá un poco de tu secuencia de comandos. Por lo tanto, deberá utilizar una utilidad que comprenda más idiomas de los que podría esperar.

-Adán


Para respuestas ajax / json, utilizo el siguiente código PHP para eliminar comentarios del código HTML / JavaScript, por lo que sería más pequeño (aproximadamente 15% de ganancia para mi código).

// Replace doubled spaces with single ones (ignored in HTML any way) $html = preg_replace(''@(/s){2,}@'', ''/1'', $html); // Remove single and multiline comments, tabs and newline chars $html = preg_replace( ''@(//*([^*]|[/r/n]|(/*+([^*/]|[/r/n])))*/*+/)|((?<!:)//.*)|[/t/r/n]@i'', '''', $html );

Corto y efectivo, pero puede producir resultados inesperados, si su código tiene una sintaxis $ itty.


Si ya usa un editor como UltraEdit , puede abrir uno o varios archivos PHP y luego usar un simple Buscar y reemplazar (CTRL + R) con la siguiente expresión regular de Perl

(?s)//*.*/*/

Tenga en cuenta que la expresión regular anterior también elimina los comentarios dentro de un sring, es decir, en el echo "hello/*babe*/"; el /*babe*/ se eliminaría también. Por lo tanto, podría ser una solución si tiene pocos archivos para eliminar comentarios, con el fin de estar absolutamente seguro de que no reemplaza incorrectamente algo que no es un comentario, tendría que ejecutar el comando Buscar y Reemplazar y aprobar cada vez lo que se reemplaza.


Solución Bash: si desea eliminar recursivamente los comentarios de todos los archivos PHP comenzando desde el directorio actual, puede escribir en el terminal este único trazo. (usa el archivo temp1 para almacenar contenido de PHP para su procesamiento) Tenga en cuenta que esto borrará todos los espacios en blanco con comentarios.

find . -type f -name ''*.php'' | while read VAR; do php -wq $VAR > temp1 ; cat temp1 > $VAR; done

Entonces deberías eliminar el archivo temp1 después.

si PHP_BEAUTIFER está instalado, entonces puede obtener un código muy formateado sin comentarios con

find . -type f -name ''*.php'' | while read VAR; do php -wq $VAR > temp1; php_beautifier temp1 > temp2; cat temp2 > $VAR; done;

luego elimine dos archivos ( temp2 , temp2 )


Yo usaría tokenizer . Aquí está mi solución. Debería funcionar tanto en PHP 4 como en 5:

$fileStr = file_get_contents(''path/to/file''); $newStr = ''''; $commentTokens = array(T_COMMENT); if (defined(''T_DOC_COMMENT'')) $commentTokens[] = T_DOC_COMMENT; // PHP 5 if (defined(''T_ML_COMMENT'')) $commentTokens[] = T_ML_COMMENT; // PHP 4 $tokens = token_get_all($fileStr); foreach ($tokens as $token) { if (is_array($token)) { if (in_array($token[0], $commentTokens)) continue; $token = $token[1]; } $newStr .= $token; } echo $newStr;


una versión más poderosa: eliminar todos los comentarios en la carpeta

<?php $di = new RecursiveDirectoryIterator(__DIR__,RecursiveDirectoryIterator::SKIP_DOTS); $it = new RecursiveIteratorIterator($di); $fileArr = []; foreach($it as $file){ if(pathinfo($file,PATHINFO_EXTENSION) == "php"){ ob_start(); echo $file; $file = ob_get_clean(); $fileArr[] = $file; } } $arr = [T_COMMENT,T_DOC_COMMENT]; $count = count($fileArr); for($i=1;$i < $count;$i++){ $fileStr = file_get_contents($fileArr[$i]); foreach(token_get_all($fileStr) as $token){ if(in_array($token[0],$arr)){ $fileStr = str_replace($token[1],'''',$fileStr); } } file_put_contents($fileArr[$i],$fileStr); }


$fileStr = file_get_contents(''file.php''); foreach (token_get_all($fileStr) as $token ) { if ($token[0] != T_COMMENT) { continue; } $fileStr = str_replace($token[1], '''', $fileStr); } echo $fileStr;

editar Me di cuenta de que Ionut G. Stan ya lo ha sugerido, pero dejaré el ejemplo aquí


/* * T_ML_COMMENT does not exist in PHP 5. * The following three lines define it in order to * preserve backwards compatibility. * * The next two lines define the PHP 5 only T_DOC_COMMENT, * which we will mask as T_ML_COMMENT for PHP 4. */ if (! defined(''T_ML_COMMENT'')) { define(''T_ML_COMMENT'', T_COMMENT); } else { define(''T_DOC_COMMENT'', T_ML_COMMENT); } /* * Remove all comment in $file */ function remove_comment($file) { $comment_token = array(T_COMMENT, T_ML_COMMENT, T_DOC_COMMENT); $input = file_get_contents($file); $tokens = token_get_all($input); $output = ''''; foreach ($tokens as $token) { if (is_string($token)) { $output .= $token; } else { list($id, $text) = $token; if (in_array($id, $comment_token)) { $output .= $text; } } } file_put_contents($file, $output); } /* * Glob recursive * @return [''dir/filename'', ...] */ function glob_recursive($pattern, $flags = 0) { $file_list = glob($pattern, $flags); $sub_dir = glob(dirname($pattern) . ''/*'', GLOB_ONLYDIR); // If sub directory exist if (count($sub_dir) > 0) { $file_list = array_merge( glob_recursive(dirname($pattern) . ''/*/'' . basename($pattern), $flags), $file_list ); } return $file_list; } // Remove all comment of ''*.php'', include sub directory foreach (glob_recursive(''*.php'') as $file) { remove_comment($file); }