将元素添加到提取的样式表中的每个CSS规则(以字符串形式)

问题描述 投票:0回答:1

我想更改从 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 }';

使用新字符串,我想影响电子邮件正文的样式,以便它不再对我的网站样式产生任何影响。

提前致谢!

php css html-email imap styling
1个回答
0
投票

这个主题的帮助下,我找到了解决问题的方法。

通过以下函数,我从字符串中解析 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;

                        }
© www.soinside.com 2019 - 2024. All rights reserved.