2009-07-05 17 views
27

Cercare una sequenza regolare di corrispondenze e sostituzioni (preferibilmente PHP ma non importa) per cambiarlo (l'inizio e la fine sono solo testo casuale che deve essere conservato).RegExp per eliminare i commenti HTML

IN:

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 questa OUT:

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 

Grazie.

+0

Per quanto posso vedere, si tenta di eliminare i commenti? –

+3

Lo hai pubblicato in modo estremamente illeggibile e incomprensibile. Da quello che posso raccogliere usando tutte le barre di scorrimento orizzontali, posso vedere, che stai cercando di eliminare i commenti. È così? Se no, ti interessa chiarire? – shylent

+2

Si prega di modificare questo per qualcosa come "RegExp per spogliare i commenti HTML", dal momento che è in realtà quello che fa la tua risposta. – Novelocrat

risposta

60

Stai solo cercando di rimuovere i commenti? Che ne dite di

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

o leggermente migliore (suggerito dallo stesso interrogante):

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

Ma ricordate, HTML è non regolari, in modo da utilizzare le espressioni regolari per analizzare vi condurrà in un mondo di ferite quando qualcuno lancia casi bizzarri.

+0

No, voglio far diventare IN l'OUT, esattamente com'è. –

+4

Non vedo altre differenze oltre ai commenti. Ci farai indovinare? –

+0

@James Brooks, l'unica differenza tra IN e OUT è che IN ha commenti e OUT no. Quindi cos'altro vuoi ma spogliare i commenti? –

7

Ah ho fatto,

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

Sì, grazie ora tutto ha senso! – shylent

+0

Questo non è buono come il mio. –

+4

@Paul: In realtà è meglio, perché> non preceduto da - non termina un commento HTML. Il bit importante che è cambiato è stato l'utilizzo di una corrispondenza non avida o più breve. – Novelocrat

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

Questo codice PHP rimuoverà tutti i tag di commento HTML dalla stringa $ html.

+3

Dettagli sui modificatori: U rende Ungreedy e così va solo al primo commento chiuso. non lo rende maiuscolo (non sono sicuro del motivo per cui è necessario qui) s significa che i newline sono consentiti anche all'interno dei commenti. –

+0

+1 per Ungreedy in particolare viene chiamato separatamente dall'espressione regolare per rendere più semplice la comprensione/lettura. –

+1

Usiamo questo script da una coppia ormai da anni e ha funzionato bene. Ma per favore considera che ignora il fatto che la stringa ' // ... ' – KTB

3

provare la seguente, se i tuoi commenti contengono interruzioni di riga:

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

Questo non è un buon modo per affrontare il problema di newline. In PHP puoi usare il modificatore 's' per consentire a'. 'Di trovare le nuove linee. In JavaScript non ha una modalità 's', ma la soluzione alternativa è sostituire' .' con '[\ S \ s]'. È molto più efficiente di '(. | \ N)'. A proposito, l'OP stava usando PHP, che non ha un modificatore 'g'. –

+0

preg_match_all è il modo per indicare globale (modificatore g) – Snapey

+0

Questo deve essere rimosso in quanto è un modello pericoloso e molto ricco di risorse. –

16

non dimenticate di prendere in considerazione i commenti condizionali, come

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

li rimuoverà. Prova questo:

Questo rimuoverà anche i commenti condizionali rivelati di livello inferiore, però.

EDIT:

Questo non rimuoverà livello inferiore-rivelata o di livello inferiore nascosto commenti.

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

anche questo codice rimuove il codice javascript. è troppo male: |

Ecco l'esempio JavaScript codice verrà rimuovere con questo codice:

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

ma ... perché dovresti avvolgere JS in tag di commento html? – jammypeach

+3

I browser molto, molto, molto vecchi non eseguono javascript e lo stampano invece sulla pagina. I tag di commento impediscono la stampa dello script. – lededje

+0

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

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

Opere in JavaScript e VBScript anche come"."Non corrisponde a interruzioni di linea in tutte le lingue

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 versione migliore sarebbe:

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

Si abbina commenti HTML come questi:

<!-- 
multi line html comment 
--> 

o

<!-- single line html comment --> 

e wha t è più importante che corrisponda a commenti come questo (l'altra regex dimostrato da altri non coprire questa situazione):

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

Nota

Anche se sintatticamente quello qui sotto è un html commento Il tuo browser potrebbe analizzarlo in qualche modo in modo diverso e quindi potrebbe avere un significato speciale. Strippare tali stringhe potrebbe infrangere il tuo codice.

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

Una grande regex qui.Tuttavia, potrebbe essere più utile passare a quanto segue in modo che il commento possa essere completamente rimosso. '' '(? = ) '' ' – outboundexplorer

+0

questo è il migliore – ismail

+0

Perché non potrebbe essere solo' () '? – Jarod

1

Ecco il mio tentativo:

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

Questo sarà anche rimuovere i commenti multilinea e non rimuoverà di livello inferiore-rivelata o commenti di livello inferiore nascosto.

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); 
Problemi correlati