Forum Webscript.Ru

Программирование => PHP => Тема начата: Босc всех зон от 22 Марта 2004, 18:40:21

Название: Вырезать html коментарии
Отправлено: Босc всех зон от 22 Марта 2004, 18:40:21
Нужно вырезать HTML коментарии.

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

Это Синтаксис регулярных выражений (http://ua.php.net/manual/ru/pcre.pattern.syntax.php) читал вдумчиво 3 раза :)

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

Сейчас сделал через preg_replace_callback (http://ua.php.net/manual/ru/function.preg-replace-callback.php) хотя думаю можно сделать одним регом, подскажите :)
Название: Вырезать html коментарии
Отправлено: Макс от 22 Марта 2004, 19:20:09
Цитировать
Босc всех зон:
но нормального результата так и не добился.

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

Попробуй такой регексп:
\\s*(?!<\\/script>)/imsU
(не уверен что модификатор m здесь нужен)
Название: Вырезать html коментарии
Отправлено: Макс от 22 Марта 2004, 19:21:11
пробел между > и ) вставляет форум. Его (пробела) там быть не должно
Название: Вырезать html коментарии
Отправлено: Босc всех зон от 22 Марта 2004, 20:08:26
Да, пробел и я не вставлял. И кстати слеш перед перед /script> тоже стоял, может форум проглотил.

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

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

Тесты:

$text = "
 
 
 
  other html content
";
echo preg_replace("/\\\\s*(?!<\\\\/script>)/isU", "", $text);


Результат:

 
 
 
  other html content
Название: Вырезать html коментарии
Отправлено: Mog. от 23 Марта 2004, 08:57:45
Цитировать
Босc всех зон:
после которой не идёт определённая последовотельность символов

Цитировать
Макс:
(?!определенная_последовательность)
Название: Вырезать html коментарии
Отправлено: Босc всех зон от 23 Марта 2004, 12:45:39
Хм, наверное я где-то ошибаюсь но цитата из мана:
Цитировать
... Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений. Например, \\w+(?=;) совпадает со словом, за которым следует символ \';\', но при этом сама точка с запятой в совпадение не включается. А foo(?!bar) соответствует любому появлению "foo", после которого не идёт "bar". ...


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

  $text = preg_replace("/(]*>\\\\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("/(]*>\\\\s*)?()(\\\\s*<\\\\/script>)?/isU", "_callback", $text);