регулярное... вырезание html комментариев

BoBka-altRUist

Новичок
регулярное... вырезание html комментариев

как удалить комментарии из html текста?
т.е. что-то типа этого:
PHP:
$text = '<head><!-- коммент --></head>';
$text = preg_replace('/<!--[^=]*-->/Uis', '', $text);
но нужно как-то учесть что бывает javascript оформленный в стиле:
PHP:
  <SCRIPT LANGUAGE="JavaScript">
  <!--
.....код..........	
  //-->
  </SCRIPT>
или лучше искать то что надо оставить т.е. найти код с javascript-ом, заменить его на свои символы потом пройтись
первым реплейсом удалить все комментарии, после чего заменить ранее заменные свои символы на оформление javascript.
но этот вариант наверное не совсем верный, может есть вариант как заменить одним проходом?
 

BoBka-altRUist

Новичок
Армян да, ваша правда.
Gremboloid это вешь!!! спасибо огромное, хорошо описано! чувствую просветление!
 

BoBka-altRUist

Новичок
немного "поэкспериментировав" пришел к такому коду который не могу очистить:

PHP:
$text = 'kjkljjkl kjkljl kljkl l<head><!-- коммент --></head>  jhkjh jhjkhk kj h
<SCRIPT LANGUAGE="JavaScript"><!--
var i = "dfsfdsf";
  //--></SCRIPT>

<SCRIPT>
  <!--
var i = "dfsfdsf";
  //-->
</SCRIPT>

</html>
<tr>

  <input type=text name="test" value="123456789">
  </td>
</tr>
<!--//
<tr>
  <td><b>URL</b></td>
  <td><input type=text name=url size="50" value="" class="form"></td>
</tr>
//-->
       kjkjkjjk
<tr>
  <td><b
';

первый вариант шаблона (спасибо всем кто написал выше) сделал такой (на месте "_" в строках "script>_)" пробела нет ):

$text = preg_replace("/<!--[^-]*-->(?!\s*<\/script>)/Uis", "", $text);
т.е. находим все что начинается "<!--" заканчивается "-->" но не сорержит символ "-" причем после "-->" не должно быть "</script>"
работает но вдруг в комментарии будет знак "-" тогда этот вариант не пройдет

второй вариант к которому пришел:

$text = preg_replace("/(?<!(Script\">|<script>))<!--(.*?)-->(?!\s*<\/script>)/is", "", $text);
т.е. знак "-" заменил на любое вхождение, но тогда он становится жадным, добавил еще ретроспективную проверку (перед "<!--" проверить нет ли script"> или script> ) все работает, но только приусловии что после <SCRIPT LANGUAGE="JavaScript"> или <SCRIPT> нет пробелов, переносов табуляций и т.д. но добавить в шаблон учет \s* перед "<!--" нельзя, т.к. ретроспективная проверка ограничена строками фиксированной длины :(


вот если бы отказаться от этой проверки:


$text = preg_replace("/<!--(.*?)-->(?!\s*<\/script>)/is", "", $text);

получаем:

PHP:
kjkljjkl kjkljl kljkl l<head></head>  jhkjh jhjkhk kj h
<SCRIPT LANGUAGE="JavaScript">
       kjkjkjjk
<tr>
  <td><b
т.е. первый "простой" комментарий обрабатывает нормально, доходит до второго начало <!-- устраивает и ищет конец который удовлетворяет, запоминая начало, таким образом седает нужное.


и вот назрел вопрос: можно ли как-то сделать чтобы в последнем шаблоне не запоминалось начало, т.е. все время применялся весь шаблон от начала до конца, если не удовлетворяет переходил к следующему.

либо для первого шаблона, как можно в нем реализовать такой вариант:
$text = preg_replace("/<!--[^-->]*-->(?!\s*<\/script>)/Uis", "", $text);
т.е. в посимвольном сравнении использовать группу символов или может быть решение вообще в другом месте?
 

Димон

Новичок
А нафига вообще скрипт в коменты прятать? Эпоха нетскейп 4 и младше уже давно канула в лету. А кто им пользуется пусть идет лесом.
 

BoBka-altRUist

Новичок
ну этого я не знаю, разработчики часто что-то комментируют если есть такая возможность...
(я только вырезать хочу все комменты)
 

dimagolov

Новичок
BoBka-altRUist, не страдай фигней, а лучше пакуй JS код. Чем паковать можешь почитать тут
 

BoBka-altRUist

Новичок
dimagolov идея не в том чтобы оптимизировать страницы сайта а скорее в том чтобы пропарсить удаленные и получить код без комментариев, т.к. их наличие критично.

з.ы.:хотя конечно в идее упаковщика что-то есть, можно пройтись по всему коду разок и удалить все пробелы, табы, переносы, а потом использовать один из верхних шаблонов... но может есть решение в один проход
 
Сверху