Правильная очистка html-комментариев

Berkut100

Новичок
Правильная очистка html-комментариев

Неполучается написать регулярку, которая бы удаляла все html-комментарии - например - <!--текст --> , но не удаляла бы <!--текст //--> (так комментируют яваскрипт, который удалять не надо)

Такие варианты регулярок не помогают:
PHP:
$buffer = preg_replace( "/(<!--.*?-->)/s", "", $buffer );   //удалит все комментарии;
$buffer = preg_replace( "/(<!--[^\/]+-->)/", "", $buffer );    //не будет удалять комментарии в которых просто встречается /
$buffer = preg_replace( "/(<!--(.*?)[^\/]{2}-->)/s", "", $buffer );  //такой вариант вообще не пойму как работает...
в общем-то задача состоит в том, что бы не удалять яваскрипт, который может быть записан как
<script>
<!--
//вот такой блок удалять не надо
a = 5;
b = 2;
c = a + b;
//-->
</script>

<!--
простой комментарий
// а вот такой надо удалить
-->
 

whirlwind

TDD infected, paranoid
поставить перед --><script> два отрицания /

ЗЫ. собсно оно и есть

[^\/]{2}
 

Berkut100

Новичок
да, это понятно, но оно не работает. И ещё может быть не только //--></script>, но и
//-->

</script>

можно сделать так:
PHP:
$buffer = preg_replace( "/(<!--(.*?)[^\/]{2}-->\r*\n*</script>)/s", "", $buffer );
но так удаляется вообще всё
 

whirlwind

TDD infected, paranoid
угу. понятно в чем трабла. конфликтует квантификатор с отрицанием и хавает максимальную строку. в общем наверно можно extended патернами, но я чет попробовал сходу не получилось. советую preg_replace_callback с дополнительной проверкой.
 

Berkut100

Новичок
спасиб, буду думать...

-~{}~ 22.11.06 15:22:

Если у кого-то есть такие же проблемы, то можете юзать следущее :)

PHP:
function clrComm( $matches )
{
  //Правильное удаление комментариев;
  if ( strpos( $matches[0], '//-->' ) == false )
  {
    return( '' );
  }

  return( $matches[0] );
} 

$buffer = preg_replace_callback( "/(<!--.*?-->)/s", "clrComm", $buffer );    //Убираем комментарии;
 

Sergei_XP

Guest
lookbehind assertions...
"/(<!--.*?(?<!\/\/)-->)/sU"

-~{}~ 23.11.06 01:17:

ps
"/(<!--.*(?<!\/\/)--> )/sU"
 
Сверху