Удалить CDATA

Тема в разделе "Регулярные выражения", создана пользователем shake1, 4 июн 2018.

Модераторы: xpert13
  1. shake1

    shake1

    Регистр.:
    16 янв 2013
    Сообщения:
    527
    Симпатии:
    527
    Помогите регулярку поправить чтобы удаляла
    //<![CDATA[
    //]]>
    PHP:
    // remove javascript comments
    (?:<script[^>]*>|\G(?!\A))(?:[^\'"\/<]+|"(?:[^\\"]+|\\.)*"|\'(?:[^\\\']+|\\.)*\'|\/(?!\/)|<(?!\/script))*+\K\/\/[^\n|<]*
     
  2. aurora2000

    aurora2000 Постоялец

    Регистр.:
    24 авг 2014
    Сообщения:
    122
    Симпатии:
    41
    Код:
    (\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>)
    
    не?
     
  3. shake1

    shake1

    Регистр.:
    16 янв 2013
    Сообщения:
    527
    Симпатии:
    527
    Untitled-1.jpg
    Для полноты картины
    PHP:
    <?php
    namespace PHPWee;

        class 
    HtmlMin{
                
    // -- Function Name : minify - Params : $html, $js = true, $css = true
            
    public static function minify($html) {
                
    /**
                 * The set of regular expressions to match against
                 * the given HTML and their respective replacements.
                 * Reference: https://github.com/ogheo/yii2-htmlcompress
                 * @var array
                 */
                
    $filters = [
                    
    // remove javascript comments
                    
    '/(?:<script[^>]*>|\G(?!\A))(?:[^\'"\/<]+|"(?:[^\\"]+|\\.)*"|\'(?:[^\\\']+|\\.)*\'|\/(?!\/)|<(?!\/script))*+\K\/\/[^\n|<]*/xsu' => '',
                    
    // remove html comments except IE conditions
                    
    '/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/su' => '',
                    
    // remove comments in the form /* */
                    
    '/\/+?\s*\*[\s\S]*?\*\s*\/+/u' => '',
                    
    // shorten multiple white spaces
                    
    '/>\s{2,}</u' => '><',
                    
    // shorten multiple white spaces
                    
    '/\s{2,}/u' => ' ',
                    
    // collapse new lines
                    
    '/(\r?\n)/u' => '',
                ];

                return 
    preg_replace(array_keys($filters), array_values($filters), $html);
            }
        }
    Есть такое решение для CDATA, должно быть точно рабочим, но не могу сшить с исходной строкой
    PHP:
    '/^\s*\/\/<!\[CDATA\[([\s\S]*)\/\/\]\]>\s*\z/'
    http://qaru.site/questions/191987/how-to-remove-cdata-and-end
     
    Последнее редактирование: 4 июн 2018
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    236
    Симпатии:
    314
    Исходный вариант https://www.nulled.in/threads/274572/ удаляет эти комментарии http://sandbox.onlinephpfunctions.com/code/8a5a826b87fe4476e6590afd605a8deafed2caff
    Тут не учтена разница между nowdoc синтаксисом и строками в одинарных кавычках.
    Ещё тут поменяли [^\n]* на [^\n|<]*. Видимо, чтобы обрабатывать случай, когда </script> на одной строке с комментарием.
    Тогда лучше там поменять на (?: [^\n<]+ | <(?!/script) )*
     
    shake1 нравится это.