2015-02-11 6 views
1

Используя это выражение регулярного выражения:Удалить почти все HTML комментариев с помощью Regex

preg_replace('/<!--(?!<!)[^\[>].*?-->/', '', $output) 

Я могу удалить все HTML-комментарии с моей страницы за исключением всего, что выглядит следующим образом:

<!--[if IE 6]> 
    Special instructions for IE 6 here 
<![endif]--> 

Как могу ли я изменить это, чтобы исключить комментарии HTML, которые включают уникальную фразу, такую ​​как «batcache»?

Таким образом, HTML-комментарий это:

<!-- 
generated 37 seconds ago 
generated in 0.978 seconds 
served from batcache in 0.004 seconds 
expires in 263 seconds 
--> 

не будут удалены.


Этот код, кажется, сделать трюк:

preg_replace('/<!--([\s\S]*?)-->/', function($c) { return (strpos($c[1], '<![') !== false || strpos($c[1], 'batcache') !== false) ? $c[0] : ''; }, $output) 
+0

Почему вы не используете 'strip_tags'? и добавить специальные условные комментарии? –

+2

** Не используйте регулярные выражения для анализа HTML. Используйте подходящий модуль синтаксического анализа HTML. ** Вы не можете надежно проанализировать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/php или [этот поток SO] (http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php) для примеры правильного анализа HTML с PHP-модулями, которые уже были написаны, протестированы и отлажены. –

ответ

1

Это должно заменить Alle комментарии, которые не содержат "batcache". Согласование выполняется между этими двумя тегами: <!-- - -->.

$result = preg_replace("/<!--((?!batcache)(?!\\[endif\\])[\\s\\S])*?-->/", "", $str); 

Вы можете проверить его here.

Как уже было сказано другими пользователями, не всегда удобно анализировать HTML с регулярным выражением, но если у вас есть относительная уверенность в том, какой HTML-код будет анализироваться, он должен работать должным образом. Если регулярное выражение не соответствует какой-либо конкретной информации, сообщите мне.

+0

Спасибо, что это почти то, что я искал, но что случилось с условными исключениями комментариев? Я обновил свой вопрос, чтобы показать код, в котором я работал. Кроме того, я полностью понимаю, что @AndyLester говорил о разборе регулярных выражений, но в этом случае - с уникальным неизменным условием - я думаю, что все в порядке. – Rich

+0

Извините, я неправильно понял вопрос. Я думал, что вы хотите заменить все теги, кроме тех, которые содержат batcache. Я соответствующим образом изменил ответ. Если вам нужно больше совпадений, чтобы исключить, я думаю, вы можете добавить еще один отрицательный lookahead в список в формате «(?! String)». – ntrp

+0

Возможно, '[endif]' это не идеально, вы можете заменить его ' ntrp