/** * Compress HTML * * This is a heavy regex-based removal of whitespace, unnecessary comments and * tokens. IE conditional comments are preserved. There are also options to have * STYLE and SCRIPT blocks compressed by callback functions. * * A test suite is available. * * @package Minify * @author Stephen Clay */ namespace LiteSpeed\Lib; defined( 'WPINC' ) || exit; class HTML_MIN { /** * @var string */ protected $_html = ''; /** * @var boolean */ protected $_jsCleanComments = true; protected $_skipComments = array(); /** * "Minify" an HTML page * * @param string $html * * @param array $options * * 'cssMinifier' : (optional) callback function to process content of STYLE * elements. * * 'jsMinifier' : (optional) callback function to process content of SCRIPT * elements. Note: the type attribute is ignored. * * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If * unset, minify will sniff for an XHTML doctype. * * @return string */ public static function minify( $html, $options = array() ) { $min = new self( $html, $options ); return $min->process(); } /** * Create a minifier object * * @param string $html * * @param array $options * * 'cssMinifier' : (optional) callback function to process content of STYLE * elements. * * 'jsMinifier' : (optional) callback function to process content of SCRIPT * elements. Note: the type attribute is ignored. * * 'jsCleanComments' : (optional) whether to remove HTML comments beginning and end of script block * * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If * unset, minify will sniff for an XHTML doctype. */ public function __construct( $html, $options = array() ) { $this->_html = str_replace( "\r\n", "\n", trim( $html ) ); if ( isset( $options['xhtml'] ) ) { $this->_isXhtml = (bool) $options['xhtml']; } if ( isset( $options['cssMinifier'] ) ) { $this->_cssMinifier = $options['cssMinifier']; } if ( isset( $options['jsMinifier'] ) ) { $this->_jsMinifier = $options['jsMinifier']; } if ( isset( $options['jsCleanComments'] ) ) { $this->_jsCleanComments = (bool) $options['jsCleanComments']; } if ( isset( $options['skipComments'] ) ) { $this->_skipComments = $options['skipComments']; } } /** * Minify the markeup given in the constructor * * @return string */ public function process() { if ( $this->_isXhtml === null ) { $this->_isXhtml = ( false !== strpos( $this->_html, '_replacementHash = 'MINIFYHTML' . md5( $_SERVER['REQUEST_TIME'] ); $this->_placeholders = array(); // replace SCRIPTs (and minify) with placeholders $this->_html = preg_replace_callback( '/(\\s*)]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i', array( $this, '_removeScriptCB' ), $this->_html ); // replace STYLEs (and minify) with placeholders $this->_html = preg_replace_callback( '/\\s*]*>)([\\s\\S]*?)<\\/style>\\s*/i', array( $this, '_removeStyleCB' ), $this->_html ); // remove HTML comments (not containing IE conditional comments). $this->_html = preg_replace_callback( '//', array( $this, '_commentCB' ), $this->_html ); // replace PREs with placeholders $this->_html = preg_replace_callback( '/\\s*]*?>[\\s\\S]*?<\\/pre>)\\s*/i', array( $this, '_removePreCB' ), $this->_html ); // replace TEXTAREAs with placeholders $this->_html = preg_replace_callback( '/\\s*]*?>[\\s\\S]*?<\\/textarea>)\\s*/i', array( $this, '_removeTextareaCB' ), $this->_html ); // trim each line. // @todo take into account attribute values that span multiple lines. $this->_html = preg_replace( '/^\\s+|\\s+$/m', '', $this->_html ); // remove ws around block/undisplayed elements $this->_html = preg_replace( '/\\s+(<\\/?(?:area|article|aside|base(?:font)?|blockquote|body' . '|canvas|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|figcaption|figure|footer|form' . '|frame(?:set)?|h[1-6]|head|header|hgroup|hr|html|legend|li|link|main|map|menu|meta|nav' . '|ol|opt(?:group|ion)|output|p|param|section|t(?:able|body|head|d|h||r|foot|itle)' . '|ul|video)\\b[^>]*>)/i', '$1', $this->_html ); // remove ws outside of all elements $this->_html = preg_replace( '/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?$1$2$3<', $this->_html ); // use newlines before 1st attribute in open tags (to limit line lengths) // $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html); // fill placeholders $this->_html = str_replace( array_keys( $this->_placeholders ), array_values( $this->_placeholders ), $this->_html ); // issue 229: multi-pass to catch scripts that didn't get replaced in textareas $this->_html = str_replace( array_keys( $this->_placeholders ), array_values( $this->_placeholders ), $this->_html ); return $this->_html; } /** * From LSCWP 6.2: Changed the function to test for special comments that will be skipped. See: https://github.com/litespeedtech/lscache_wp/pull/622 */ protected function _commentCB( $m ) { // If is IE conditional comment return it. if ( 0 === strpos( $m[1], '[' ) || false !== strpos( $m[1], ' HTML Settings -> HTML Keep comments if ( count( $this->_skipComments ) > 0 ) { foreach ( $this->_skipComments as $comment ) { if ( $comment && strpos( $m[1], $comment ) !== false ) { return $m[0]; } } } // Comment can be removed. return ''; } protected function _reservePlace( $content ) { $placeholder = '%' . $this->_replacementHash . count( $this->_placeholders ) . '%'; $this->_placeholders[ $placeholder ] = $content; return $placeholder; } protected $_isXhtml = null; protected $_replacementHash = null; protected $_placeholders = array(); protected $_cssMinifier = null; protected $_jsMinifier = null; protected function _removePreCB( $m ) { return $this->_reservePlace( "_reservePlace( "\\s*$)/', '', $css ); // remove CDATA section markers $css = $this->_removeCdata( $css ); // minify $minifier = $this->_cssMinifier ? $this->_cssMinifier : 'trim'; $css = call_user_func( $minifier, $css ); return $this->_reservePlace( $this->_needsCdata( $css ) ? "{$openStyle}/**/" : "{$openStyle}{$css}" ); } protected function _removeScriptCB( $m ) { $openScript = "_jsCleanComments ) { $js = preg_replace( '/(?:^\\s*\\s*$)/', '', $js ); } // remove CDATA section markers $js = $this->_removeCdata( $js ); // minify /** * Added 2nd param by LiteSpeed * * @since 2.2.3 */ if ( $this->_jsMinifier ) { $js = call_user_func( $this->_jsMinifier, $js, trim( $m[2] ) ); } else { $js = trim( $js ); } return $this->_reservePlace( $this->_needsCdata( $js ) ? "{$ws1}{$openScript}/**/{$ws2}" : "{$ws1}{$openScript}{$js}{$ws2}" ); } protected function _removeCdata( $str ) { return ( false !== strpos( $str, '' ), '', $str ) : $str; } protected function _needsCdata( $str ) { return ( $this->_isXhtml && preg_match( '/(?:[<&]|\\-\\-|\\]\\]>)/', $str ) ); } } Jumbuck Market https://validator.w3.org/feed/docs/rss2.html Игровые Автоматы И Слоты Онлайн Бесплатно Blog Standard Step-by-step Guide Book: কিভাবে Mostbet থেকে টাকা তুলব Securely Locaminas Locação Sobre Veículos Christians Blending Collectively Ministries Foundation, Inc Ogun Condition Archiving Portal Pokerdom Casino كيفية تحديث سكربت الطيارة 1xbet مهكر بانتظام Türkiyenin #1 Canlı Casinoları Gerçek Krupiyeli Online Casinolar! Diamond Casino Heist Pay Out, Vault Time & Loot, Daily Cash Grab Diamond Casino Heist Pay Out, Vault Time & Loot, Daily Cash Grab Home 1 How To Win At Slots? 10 Top Tips For Slot Machines 5 burning heart Pinco Casino Рабочее Зеркало 1xbet На Сегодня Доступ Прямо Сейчас” Mostbet Türkiye: Resmi Site, Kayıt, Bonus A Few 673 Giriş Yapmak 1xbet Казино Официальный Сайт И Зеркало ️ Играть На приличные В Лучшие Слоты 1хбет <tg>1win ⭐ Ei̇dman Və Kazino Mərcləri >> Depozit Bonusu $1000</tg> تحميل برنامج 1xbet للاندرويد لتعزيز تجربة المستخدم الرياضية “Book Of Ra Typical Slot By Novomatic Play Demo On The Web 2025 تنزيل برنامج 1xbet Vavada Casino 1win Türkiye Resmi Spor Bahisleri Sitesi Giriş Ve Kaydol استراتيجيات الفوز باستخدام برومو كود 1xbet 2025 Casinon Med Svensk Licens Komplett Lista Nya Casinon Med Licens Oficjalna Strona Graj Online, Graj Na Prawdziwe Pieniądze” 1xBet Casino Ggbet Polska Zakłady Sportowe I Esportowe Bonus Do 500% Mein Schweizer Online-casino “Casinos Latvijā Labākie Net Konekcije Kazino 2025” “Ten Beste Online Internet Casinos Schweiz 2025 “Free Of Charge Demo, Bluff Eller Riktiga Pengar? 2025 Zagraj W Darmową Wersję Trial” Başarıbet Indir: Hızlı İndirme Ve Five Hundred Tl Bonus Fırsatı Başarıbet Online Casino Play Free Plinko Demo Mode” Glory Online Casino Play Online Casino Games With Glory 1xbet официальный сайт: актуальная ссылка для установки приложения на iOS Casinò On The Internet Non Aams Catalogo Migliori Casinò Stranieri Non Solo Aams Мостбет Букмекер: Официальный Сайт Игровых Автоматов Mostbet Bookmaker Aviator Game Download Software: Apk For Android And Ios 2025 Free & Exciting Twenty-four 7 Card Games 1xbet Вход На официальному Сайт 1хбет и Армении: Ставки на Спорт Онлайн, Зеркало Am 1xbet Com Vovan Казино Официальный Сайт Казино С Азартными Играми Казино Покердом Официальный Сайт Вход И Регистрация В Pokerdom Casino 1xbet Зеркало Официального Сайта 1хбет Вход На сегодня Через Рабочие Зеркала Mostbet Payment Alternatives Minimum Deposit Disengagement Time Man Bet Entire Life Financial Savings And Sold Every Thing He Owned In A Single Different Roulette Games Spin: “i Chosen Red “” Aviator Sport Download App & Apk Play Aviator By Spribe Zakłady Sportowe Forum: Nadchodzące Wydarzenia I Strategie Zakładów Arnies Language School Лицензированная Букмекерская Компания 1xbet В Казахстане En İyi Casino Oyunları ile Eğlenceli ve Karlı Vakit Geçirme Starzbet’te Slot Oyunları ile Yüksek Kazançlı Deneyimler Yaşayın