preg_replace удалить текст стиля / тег css - PullRequest
1 голос
/ 28 марта 2020

Мне нужна помощь с моим PHP, так как мне трудно избавиться от тега style type="text/css". Я хочу удалить тег стиля, чтобы заменить его пустой строкой.

Когда я пытаюсь это сделать:

if (strpos($inbox_message, '<style type="text/css">') !== false) {
    echo (preg_replace('/<style[^>]*>(([^<]|[<[^\/]|<\/[^s]|<\/s[^t])*)<\/style>/i','',$inbox_message));
}

Он по-прежнему будет отображать тег стиля на странице html.

Вот что он показывает:

<style type="text/css"> body {position: relative; font-family: Segoe UI; font-size: 12px; } .pageHeader {color: #9C9C9C; font-size: 160%; padding: 0px 0px 6px 0px} .pageHeaderLogo {padding-right: 15px;} .pageHeaderTitle{border-left: 1px solid #CCCCCC; padding: 5px;} .pageFooter {width: 100%; background-color: #f2f2f2; font-size: 12px; font-family: Segoe UI; padding:4px 4px 4px 4px; } .pageFooterLogo {text-align:right; width:100%} .padCells { padding: 0px 6px 0px 0px; } .preHeader {display: none !important; visibility:hidden; opacity:0; color:transparent; height:0; width:0; }</style>

Не могли бы вы показать мне пример того, как я могу использовать preg_replace, чтобы найти тег style type=text/css, чтобы я мог их удалить?

Спасибо.

РЕДАКТИРОВАТЬ: Извините, я понял, что мне нужно только удалить тело в тегах стиля, так как я хочу сохранить другие теги в стиле.

/*GENERAL*/
    table{width:100%}
    body{background-color:#ebebeb; width: 100%; margin:0; padding:0; -webkit-font-smoothing: antialiased;font-family: "Segoe UI",SegoeUI,"Helvetica Neue",Helvetica,sans serif; -webkit-text-size-adjust: 100%;}
    div.ms-article-container #emailbodyouter .emailbodyinner section{margin:0}
    div.ms-article-container #emailbodyouter .emailbodyinner table div {margin:0}
    div.content-article #emailbodyouter .emailbodyinner section{margin:0}
    div.content-article #emailbodyouter .emailbodyinner table div {margin:0}

1 Ответ

4 голосов
/ 28 марта 2020

Дословный ответ:

$inbox_message = preg_replace('#<style type="text/css">.*?</style>#s', '', $inbox_message);

Вам не нужно проверять, существует он или нет - если нет, preg_replace ничего не сделает. Вам не нужно беспокоиться о том, что находится внутри тега - об этом позаботится не жадный квантификатор (если у вас нет случайного наличия вложенного тега <style>, что было бы необычно). И вам не нужно беспокоиться о том, чтобы избежать косой черты, если вы выберете другой разделитель.

Дословный ответ: Осторожно, Зал go.

$doc = new DOMDocument();
$doc->loadHTML($inbox_message);
$xpath = new DOMXpath($doc);
$styles = $xpath->query('//style[@type="text/css"]');
if ($styles) {
  foreach ($styles as $style) {
    $style->parentNode->removeChild($style);
  }
}
$inbox_message = $doc->saveHTML();

РЕДАКТИРОВАТЬ после того, как вопрос изменился: так как по умолчанию нет парсера CSS, мы все равно вынуждены использовать регулярное выражение. Примерно так должно быть хорошо. Зал go метод:

$inbox_message = preg_replace_callback('#<style type="text/css">.*?</style>#s', function($match) {
  return preg_replace('#body\s*{(?:[^"}]|"[^"]*")*}#', '', $match[0]);
}, $inbox_message);

Анти-Зал go метод:

$doc = new DOMDocument();
$doc->loadHTML($inbox_message);
$xpath = new DOMXpath($doc);
$styles = $xpath->query('//style[@type="text/css"]');
if ($styles) {
  foreach ($styles as $style) {
    $style->textContent = preg_replace('#body\s*{(?:[^"}]|"[^"]*")*}#', '', $style->textContent);
  }
}
$inbox_message = $doc->saveHTML();
...