Intereting Posts
Mac обновил PHP до 5.6, но CLI php -v получит 5.3.28? загрузка нескольких файлов на сервер и запись в базу данных PHP MySQLi Singleton для Ajax-запросов заканчивается многими процессами Автоматическое заполнение текстовой области с помощью php curl Как определить язык текста? Создание экземпляра класса PHP. Использовать или не использовать круглые скобки? Попытка получить свойство не-объекта в PHP JSON Перемещение нескольких объектов по ссылкам без повторения HTML в php mail-функции Использование регулярного выражения subpattern to вместо использования регулярного выражения 2 раза в php Regex найти ссылку Youtube в строке Неустранимая ошибка: вызов неопределенной функции new_mysqli () в C: \ wamp \ www \ work \ conn.php в строке 8 рассчитать количество дней недели в диапазоне дат Как обрезать и выгружать фотографию с помощью плагина jQuery с помощью php Корень документа параллельного пути Apache

Расширьте регулярное выражение PHP для покрытия атрибутов «srcset» и «style»

Я создал плагин WordPress, который превращает все ссылки в URL-адреса, относящиеся к протоколу (удаление http: и https: основываясь на тегах и атрибутах, которые я перечисляю в переменных $tag и $attribute . Это часть функции. Чтобы сэкономить место, остальную часть кода можно найти здесь .

 $content_type = NULL; # Check for 'Content-Type' headers only foreach ( headers_list() as $header ) { if ( strpos( strtolower( $header ), 'content-type:' ) === 0 ) { $pieces = explode( ':', strtolower( $header ) ); $content_type = trim( $pieces[1] ); break; } } # If the content-type is 'NULL' or 'text/html', apply rewrite if ( is_null( $content_type ) || substr( $content_type, 0, 9 ) === 'text/html' ) { $tag = 'a|base|div|form|iframe|img|link|meta|script|svg'; $attribute = 'action|content|data-project-file|href|src|srcset|style'; # If 'Protocol Relative URL' option is checked, only apply change to internal links if ( $this->option == 1 ) { # Remove protocol from home URL $website = preg_replace( '/https?:\/\//', '', home_url() ); # Remove protocol from internal links $links = preg_replace( '/(<(' . $tag . ')([^>]*)(' . $attribute . ')=["\'])https?:\/\/' . $website . '/i', '$1//' . $website, $links ); } # Else, remove protocols from all links else { $links = preg_replace( '/(<(' . $tag . ')([^>]*)(' . $attribute . ')=["\'])https?:\/\//i', '$1//', $links ); } } # Return protocol relative links return $links; 

Это работает по назначению, но на этих примерах это не работает:

 <!-- Within the 'style' attribute --> <div class="some-class" style='background-color:rgba(255,255,255,0);background-image:url("http://placehold.it/300x200");background-position:center center;background-repeat:no-repeat'> <!-- Within the 'srcset' attribute --> <img src="http://placehold.it/600x300" srcset="http://placehold.it/500 500x, http://placehold.it/100 100w"> 

Тем не менее, код частично работает для этих примеров.

 <div class="some-class" style='background-color:rgba(255,255,255,0);background-image:url("http://placehold.it/300x200");background-position:center center;background-repeat:no-repeat'> <img src="http://placehold.it/600x300" srcset="//placehold.it/500 500x, http://placehold.it/100 100w"> 

Я играл с добавлением дополнительных значений в переменные $tag и $attribute , но это не помогло. Я бы предположил, что мне нужно обновить остальное мое регулярное выражение, чтобы охватить эти два дополнительных тега? Или есть другой способ приблизиться к нему, например DOMDocument ?

Я смог упростить код, выполнив следующие действия:

 $content_type = NULL; # Check for 'Content-Type' headers only foreach ( headers_list() as $header ) { if ( strpos( strtolower( $header ), 'content-type:' ) === 0 ) { $pieces = explode( ':', strtolower( $header ) ); $content_type = trim( $pieces[1] ); break; } } # If the content-type is 'NULL' or 'text/html', apply rewrite if ( is_null( $content_type ) || substr( $content_type, 0, 9 ) === 'text/html' ) { # Remove protocol from home URL $website = $_SERVER['HTTP_HOST']; $links = str_replace( 'https?://' . $website, '//' . $website, $links ); $links = preg_replace( '|https?://(.*?)|', '//$1', $links ); } # Return protocol relative links return $links;