2009-07-05 17 views
27

Buscando una secuencia de correspondencias regexp y reemplazando (preferiblemente PHP pero no importa) para cambiar esto (el inicio y el final es solo texto aleatorio que debe conservarse).RegExp para eliminar comentarios HTML

EN:

fkdshfks khh fdsfsk 
<!--g1--> 
<div class='codetop'>CODE: AutoIt</div> 
<div class='geshimain'> 
    <!--eg1--> 
    <div class="autoit" style="font-family:monospace;"> 
     <span class="kw3">msgbox</span> 
    </div> 
    <!--gc2--> 
    <!--bXNnYm94--> 
    <!--egc2--> 
    <!--g2--> 
</div> 
<!--eg2--> 
fdsfdskh 

a esto:

fkdshfks khh fdsfsk 
<div class='codetop'>CODE: AutoIt</div> 
<div class='geshimain'> 
    <div class="autoit" style="font-family:monospace;"> 
     <span class="kw3">msgbox</span> 
    </div> 
</div> 
fdsfdskh 

Gracias.

+0

Por lo que puedo ver, ¿intentas quitar los comentarios? –

+3

Lo has publicado de una manera extremadamente ilegible e incomprensible. De lo que puedo reunir usando todas las barras de desplazamiento horizontales, puedo ver, que está tratando de quitar los comentarios. ¿Es eso así? Si no, ¿te importa aclarar? – shylent

+2

Por favor, edite esto como "RegExp para quitar los comentarios HTML", ya que de hecho es lo que hace su respuesta. – Novelocrat

Respuesta

60

¿Está tratando de eliminar los comentarios? ¿Qué hay de

s/<!--[^>]*-->//g 

o ligeramente mejor (sugerido por el propio interrogador):

<!--(.*?)--> 

Pero recuerde, el HTML es no regular, por lo que el uso de expresiones regulares para analizar que le llevará en una mundo de dolor cuando alguien le arroja casos extraños.

+0

No, quiero que el IN se convierta en OUT, exactamente como es. –

+4

No veo ninguna diferencia más que los comentarios. ¿Vas a hacernos adivinar? –

+0

@James Brooks, la única diferencia entre IN y OUT es que IN tiene comentarios y OUT no. Entonces, ¿qué otra cosa quieres sino despojar a los comentarios? –

7

Ah lo he hecho,

<!--(.*?)--> 
+4

Sí, ¡gracias ahora todo tiene sentido! – shylent

+0

Eso no es tan bueno como el mío. –

+4

@Paul: en realidad es mejor, porque> no está precedido por - no finaliza un comentario HTML. La parte importante que cambió fue usar una coincidencia no codiciosa o la más corta. – Novelocrat

44
preg_replace('/<!--(.*)-->/Uis', '', $html) 

Este código PHP eliminará todas las etiquetas de comentario HTML de la cadena $ html.

+3

Detalles sobre los modificadores: U hace Ungreedy y por lo tanto va solo al primer comentario cercano. Lo distingue entre mayúsculas y minúsculas (No estoy seguro de por qué es necesario aquí) s significa que también se permiten nuevas líneas dentro de los comentarios. –

+0

+1 para que Ungreedy se llame específicamente por separado de la expresión regular para que sea más fácil de entender/leer. –

+1

Hemos estado usando esta secuencia de comandos para una pareja desde hace años y funcionó bien. Pero tenga en cuenta que ignora el hecho de que la cadena ' // ... KTB

3

intente lo siguiente si sus comentarios contienen saltos de línea:

/<!--(.|\n)*?-->/g 
+5

' Eso no es una buena manera de hacer frente a el problema de la nueva línea. En PHP puede usar el modificador 's' para permitir que' .' coincida con las nuevas líneas. En JavaScript no tiene un modo 's', pero la solución preferida es reemplazar el' .' con '[\ S \ s]'. Es mucho más eficiente que '(. | \ N)'. Por cierto, el OP estaba usando PHP, que no tiene un modificador 'g'. –

+0

preg_match_all es la forma de indicar global (modificador g) – Snapey

+0

Esto debe eliminarse ya que es un patrón peligroso y que consume muchos recursos. –

16

no se olvide de considerar los comentarios condicionales, como

<!--(.*?)--> 

las elimina. Tal vez puedas probar:

<!--[^\[](.*?)--> 

Esto también eliminará los comentarios condicionales de nivel inferior-revelado, sin embargo.

EDIT:

esto no eliminará nivel inferior-revelada o de nivel inferior oculta comentarios.

<!--(?!<!)[^\[>].*?--> 
1

este código también es eliminar el código de javascript. eso está muy mal: |

aquí está el ejemplo de código JavaScript se retire con este código:

<script type="text/javascript"><!-- 
    var xxx = 'a'; 
    //--> 
    </script> 
+4

pero ... ¿por qué envolverías a JS en etiquetas de comentarios html? – jammypeach

+3

Muy, muy, muy, muy viejos navegadores no ejecutan javascript y en su lugar lo imprimen en la página. Las etiquetas de comentario impiden que se imprima la secuencia de comandos. – lededje

+0

puede usar esto '/ (?: [^>] \ S | ^) ] [\ s \ S] *? ->/g' https://jsfiddle.net/ 3vkrrt8e/ –

2
<!--([\s\S]*?)--> 

Obras en JavaScript y VBScript también como"."No coincide con saltos de línea en todos los idiomas

0
function remove_html_comments($html) { 
    $expr = '/<!--[\s\S]*?-->/'; 
    $func = 'rhc'; 
    $html = preg_replace_callback($expr, $func, $html); 
    return $html; 
} 

function rhc($search) { 
    list($l) = $search; 
    if (mb_eregi("\[if",$l) || mb_eregi("\[endif",$l)) { 
     return $l; 
    } 
} 
12

una versión mejor sería:

(?=<!--)([\s\S]*?)--> 

Coincide con comentarios como estos: html

<!-- 
multi line html comment 
--> 

o

<!-- single line html comment --> 

y wha t es más importante coincide con comentarios como este (el otro de expresiones regulares se muestra por otros no cubren esta situación):

<!-- this is my blog: <mynixworld.inf> --> 

Nota

Aunque sintácticamente la de abajo es un comentario HTML su navegador pudo analizar de alguna manera de manera diferente y por lo tanto, podría tener un significado especial. Pelar tales cuerdas podría romper tu código.

<!--[if !(IE 8) ]><!--> 
+1

Una gran expresión regular aquí. Sin embargo, podría ser más útil cambiar a lo siguiente para que el comentario pueda eliminarse por completo. '' '(? = ) '' ' – outboundexplorer

+0

este es el mejor – ismail

+0

¿Por qué no podría ser simplemente' () ' – Jarod

1

Aquí es mi intento:

<!--(?!<!)[^\[>][\s\S]*?--> 

Esto también eliminará los comentarios de varias líneas y no retire de nivel inferior-revelada o comentarios de nivel inferior oculto.

0
// Remove multiline comment 
    $mlcomment = '/\/\*(?!-)[\x00-\xff]*?\*\//'; 
    $code = preg_replace ($mlcomment, "", $code); 
// Remove single line comment 
    $slcomment = '/[^:]\/\/.*/'; 
    $code = preg_replace ($slcomment, "", $code); 
// Remove extra spaces 
    $extra_space = '/\s+/'; 
    $code = preg_replace ($extra_space, " ", $code); 
// Remove spaces that can be removed 
    $removable_space = '/\s?([\{\};\=\(\)\\\/\+\*-])\s?/'; 
    $code = preg_replace ('/\s?([\{\};\=\(\)\/\+\*-])\s?/', "\\1", $code);