我想更改从 HTML 电子邮件正文中提取的字符串中的每个 css 规则。 该字符串在元素内包含 css,这会影响我的网站样式。
我想向该字符串内的每个 css 规则添加一个元素(div 类)。 这可以用 php 实现吗?
示例:
$string = '<style type="text/css">body { blah blah } .div1 { blah blah } .div2 { blah blah }</style> Blah blah blah body text blah blah';
$extractcss = strip_tags($string , '<style>');
我想将 .mydiv 添加到每个 css 规则中以获得此:
$extractcss = '.mydiv body { blah blah } .mydiv .div1 { blah blah } .mydiv .div2 { blah blah }';
使用新字符串,我想影响电子邮件正文的样式,以便它不再对我的网站样式产生任何影响。
提前致谢!
在这个主题的帮助下,我找到了解决问题的方法。
通过以下函数,我从字符串中解析 CSS。
function parse_css($cssstring){
preg_match_all( '/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/', $cssstring, $arr);
$result = array();
foreach ($arr[0] as $i => $x){
$selector = trim($arr[1][$i]);
$rules = explode(';', trim($arr[2][$i]));
$rules_arr = array();
foreach ($rules as $strRule){
if (!empty($strRule)){
$rule = explode(":", $strRule);
$rules_arr[trim($rule[0])] = trim($rule[1]);
}
}
$selectors = explode(',', trim($selector));
foreach ($selectors as $strSel){
$result[$strSel] = $rules_arr;
}
}
return $result;
}
// Extract and change css style
if ( str_contains($message, '<style') ) {
$extractcss = strip_tags($message, '<style>');
$parsecss = parse_css($extractcss);
$newcssstring = '<style type="text/css">';
foreach ( $parsecss as $key => $value ) {
$newcssstring .= '.message-body '. $key .' { ';
foreach ( $value as $k => $v ) {
$newcssstring .= $k .': '. $v .'; ';
}
$newcssstring .= ' } ';
}
$newcssstring .= '</style>';
$message = preg_replace("#([<]style)(.*)([<]/style[>])#s", "<!-- style extracted -->", $message);
$message= $newcssstring . $message;
}