Автор Тема: Вырезать html коментарии  (Прочитано 3356 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Босc всех зон

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
Вырезать html коментарии
« : 22 Марта 2004, 18:40:21 »
Нужно вырезать HTML коментарии.

Проблема в конструкции , где их вырезать не нужно.

Это Синтаксис регулярных выражений читал вдумчиво 3 раза :)

Шаманил с "Утверждениями" $text preg_replace("/<!--.*-->(?!<\\/script>)/imsU"""$text);
но нормального результата так и не добился.

Сейчас сделал через preg_replace_callback хотя думаю можно сделать одним регом, подскажите :)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Вырезать html коментарии
« Ответ #1 : 22 Марта 2004, 19:20:09 »
Цитировать
Босc всех зон:
но нормального результата так и не добился.

ты бы хоть рассказал что там неправильно работало (а то тестировать код все-равно никто не будет).

Попробуй такой регексп:
\\s*(?!<\\/script>)/imsU
(не уверен что модификатор m здесь нужен)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Вырезать html коментарии
« Ответ #2 : 22 Марта 2004, 19:21:11 »
пробел между > и ) вставляет форум. Его (пробела) там быть не должно
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Босc всех зон

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
Вырезать html коментарии
« Ответ #3 : 22 Марта 2004, 20:08:26 »
Да, пробел и я не вставлял. И кстати слеш перед перед /script> тоже стоял, может форум проглотил.

Действительно модификатор m не нужен.

Если просто описать задачу не привязываясь к данному конкретному случаю, то нужно заменить часть текста, после которой не идёт определённая последовотельность символов.
Хочется знать для общего развития как это можно сделать одним регом. А не несколькими или callback\'ом

Тесты:

$text 
"
  <script>
   //<!--
    var = 1;
   //-->
  </script>
  <body ....>
  <!--
    #comments
  -->
  other html content
"
;
echo 
preg_replace("/<!--.*-->\\\\s*(?!<\\\\/script>)/isU"""$text);


Результат:

 
 
 
  other html content

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Вырезать html коментарии
« Ответ #4 : 23 Марта 2004, 08:57:45 »
Цитировать
Босc всех зон:
после которой не идёт определённая последовотельность символов

Цитировать
Макс:
(?!определенная_последовательность)
Все болезни от нервов, только сифилис от удовольствия

Оффлайн Босc всех зон

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
Вырезать html коментарии
« Ответ #5 : 23 Марта 2004, 12:45:39 »
Хм, наверное я где-то ошибаюсь но цитата из мана:
Цитировать
... Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений. Например, \\w+(?=;) совпадает со словом, за которым следует символ \';\', но при этом сама точка с запятой в совпадение не включается. А foo(?!bar) соответствует любому появлению "foo", после которого не идёт "bar". ...


Проблему решил так:

  $text 
preg_replace("/(<script[^>]*>\\\\s*)(<!--)(.*)(-->)(\\\\s*<\\\\/script>)/isU""\\\\\\1[#COMMENT#]\\\\\\3[/#COMMENT#]\\\\\\5"$text);
 
$text preg_replace("/<!--.*-->/isU"""$text);
  
$text str_replace(array("[#COMMENT#]""[/#COMMENT#]"), array("<!--""-->"), $text);


так как вариант с callback\'ом почти на порядок медленнее (странно, думал наоборот)


  
function _callback($arr)
  {
     if (empty(
$arr[1])) {
       
$ret = \'\';
     } else {
       $ret = $arr[0];
     }
     return $ret;
  }

  $text = preg_replace_callback("/(<script[^>]*>\\\\s*)?(<!--)(.*)(-->)(\\\\s*<\\\\/script>)?/isU", "_callback", $text);

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28