2009-07-05 4 views
27

Ищете регулярную регулярную последовательность совпадений и заменяет (желательно PHP, но не имеет значения), чтобы изменить это (начало и конец - это просто случайный текст, который необходимо сохранить).RegExp для разметки комментариев HTML

В:

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 

на это:

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 

Спасибо.

+0

Насколько я могу судить, вы пытаетесь снять комментарии? –

+3

Вы разместили его в невероятно непроницаемом и непостижимом виде. Из того, что я могу собрать, используя все, вы знаете, горизонтальные полосы прокрутки, я вижу, что вы пытаетесь снять комментарии. Это так? Если нет, проясните? – shylent

+2

Пожалуйста, отредактируйте это на что-то вроде «RegExp, чтобы разделить комментарии HTML», так как это на самом деле то, что ваш ответ делает. – Novelocrat

ответ

60

Вы пытаетесь удалить комментарий? Как насчет

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

или чуть лучше (по предложению самого вопрошающего):

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

Но помните, что HTML является не регулярно, поэтому, используя регулярные выражения для разбора это приведет вас в мир боли, когда кто-то бросает на него причудливые краевые дела.

+0

Нет, я хочу, чтобы IN стал OUT, точно так же. –

+4

Я не вижу никаких отличий, кроме комментариев. Ты собираешься нас угадать? –

+0

@James Brooks, единственная разница между IN и OUT заключается в том, что IN имеет комментарии и OUT нет. Итак, что еще вы хотите, но лишая комментариев? –

7

А я сделал это,

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

Да, теперь все это имеет смысл! – shylent

+0

Это не так хорошо, как мое. –

+4

@Paul: На самом деле это лучше, потому что> не предшествует - не заканчивается комментарий HTML. Важный бит, который изменился, использовал не-жадное или кратчайшее совпадение. – Novelocrat

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

Этот PHP код будет удалить все HTML теги комментариев от $ HTML строки.

+3

Подробная информация об модификаторах: U делает это неровным, и поэтому идет только к первому закрытому комментарию. i делает регистр нечувствительным к регистру (не знаете, зачем это нужно здесь) s означает, что в комментариях также допускаются символы новой строки. –

+0

+1 для Ungreedy, специально вызываемого отдельно от регулярного выражения, что упрощает его понимание/чтение. –

+1

Мы использовали этот скрипт для пары уже много лет, и он отлично работал. Но учтите, что он игнорирует тот факт, что String ' // ... ' – KTB

3

Попробуйте следующее, если ваши комментарии содержат разрывы строк:

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

Это не лучший способ иметь дело с проблема новой строки. В PHP вы можете использовать модификатор 's', чтобы позволить' .' соответствовать символам новой строки. В JavaScript нет режима 's', но предпочтительным обходным решением является замена'. 'На' [\ S \ s] '. Это намного эффективнее, чем '(. | \ N)'. Кстати, OP использовал PHP, у которого нет модификатора 'g'. –

+0

preg_match_all - это способ указать глобальный (модификатор g) – Snapey

+0

Это необходимо удалить, так как это опасный и очень ресурсоемкий шаблон. –

16

Не забудьте рассмотреть условные комментарии, так как

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

удалит их. Попробуйте это вместо:

Это также устранит условные комментарии, описанные ниже.

EDIT:

Это не приведет к удалению нижнего уровня открывшихся или нижнего уровня, скрытые комментарии.

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

Этот код также удаляет код javascript. это тоже плохо: |

вот пример Javascript код будет удалить с помощью этого кода:

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

, но ... зачем вы обертываете JS в тегах комментариев html? – jammypeach

+3

Очень, очень, очень, очень старые браузеры не запускают javascript и вместо этого печатают его на странице. Теги комментариев не позволяют напечатать сценарий. – lededje

+0

вы можете использовать это '/ (?: [^>] \ S | ^) ] [\ s \ S] *? ->/g' https://jsfiddle.net/ 3vkrrt8e/ –

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

работы в JavaScript и VBScript и как»."Не соответствует переносы строк на всех языках

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

Лучше версия будет:

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

Это соответствует HTML комментарии, подобные этим:

<!-- 
multi line html comment 
--> 

или

<!-- single line html comment --> 

и wha т является наиболее важным он соответствует комментариям, как это (другое регулярного выражение показано, другие не покрывает эту ситуацию):

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

Примечания

Хотя синтаксический один ниже является HTML комментария Вашего браузера может разобрать его как-то иначе и, следовательно, это может иметь особое значение. Удаление таких строк может привести к нарушению вашего кода.

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

Здесь можно найти большое регулярное выражение. Однако было бы более полезно изменить следующее: комментарий может быть полностью удален. '' '(? = ) '' ' – outboundexplorer

+0

это лучший – ismail

+0

Почему он не может быть просто' () '? – Jarod

1

Вот моя попытка:

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

Это также удалит мульти комментарии строки и не удалит Downlevel открывшихся или нижнего уровня, скрытые комментарии.

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); 
Смежные вопросы