使用PHP为HTML元素动态分配指定CSS类的实现方案
可直接集成的实现方案
采用PHP内置DOMDocument处理解析后的博文HTML,比正则匹配稳定性更高,不会误改文本内容,完全适配现有Parsedown解析流程。
实现逻辑
- 不改动原有博文读取、元信息解析、URL生成的逻辑
- 拦截Parsedown输出的HTML内容,用DOM方法做结构化处理:
- 遍历所有
<p>标签,检测内部是否嵌套<iframe>元素,存在则追加video类(不覆盖原有class属性) - 定位文档中第一个
<img>元素,追加feature_image类(不覆盖原有class属性)
- 遍历所有
- 处理完成后再输出到页面,避免乱码、标签损坏问题
完整可替换代码
直接替换你现有的博文渲染判断块即可:
if (!(empty($get_id)) && is_numeric($get_id) && $all_blog_files[$get_id]) { $open = fopen($all_blog_files[$get_id][0] , "r"); $data = @fread($open, filesize($all_blog_files[$get_id][0])); fclose($open); $lines = explode("\n", $data); $date_explode = explode('-', $lines[2]); $month = $date_explode[0]; $day = $date_explode[1]; $year = $date_explode[2]; $date_mk = mktime(0, 0, 0, $month, $day, $year); $date = date($date_format, $date_mk); $title = $lines[0]; // 移除URL中的特殊字符 $title_strip = str_replace([",","- ", "$", "%", "?", "!"],"", $title); // 替换URL中的拉丁字符 $unwanted_array = array('Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'Đ'=>'Dj', 'đ'=>'dj', 'ć'=>'c', 'Ć'=>'C', 'Č'=>'C', 'č'=>'c'); $clean_title = strtr( $title_strip, $unwanted_array ); $url_title = $all_blog_files[$postnumber][1].'/'.str_replace(" ", "-", $clean_title); $lines = array_slice($lines,3); $content_blog = implode("\n", $lines); $content_blog = str_replace("##more##", "", $content_blog); $page_title = $title. " - Radio Ritam Srca Blog"; $page_desc = substr(strip_tags($lines[1]), 0, 80). ' ' . $page_desc; echo "<div class='blog-wrap'>"; echo "<h1 class='blog-title'>$title</h1>"; echo "<p class='blog-date'>$date</p>"; // --- 新增功能处理开始 --- $parsed_content = $parsedown->text($content_blog); $dom = new DOMDocument(); // 传入编码标记避免中文乱码,屏蔽不规则HTML的报错 @$dom->loadHTML('<?xml encoding="utf-8" ?>' . $parsed_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // 给嵌套iframe的p标签添加video类 $p_list = $dom->getElementsByTagName('p'); foreach ($p_list as $p_item) { if ($p_item->getElementsByTagName('iframe')->length > 0) { $old_class = $p_item->getAttribute('class'); $new_class = $old_class ? trim($old_class . ' video') : 'video'; $p_item->setAttribute('class', $new_class); } } // 给第一个img标签添加feature_image类 $img_list = $dom->getElementsByTagName('img'); if ($img_list->length > 0) { $first_img = $img_list->item(0); $old_class = $first_img->getAttribute('class'); $new_class = $old_class ? trim($old_class . ' feature_image') : 'feature_image'; $first_img->setAttribute('class', $new_class); } // 输出处理后的内容,移除多余的xml标记 $final_content = str_replace('<?xml encoding="utf-8" ?>', '', $dom->saveHTML()); echo $final_content; // --- 新增功能处理结束 --- if ($disqus_comments == true){include('inc/plugins/disqus.php');} echo "</div>"; echo "<a class='btn btn-red' href=\"$previous\">Nazad Na Blog</a>"; }
注意事项
- 代码保留了原有所有逻辑,仅替换了原来直接输出Parsedown结果的部分
- 追加类名时不会覆盖标签原有的class属性,兼容原有已添加类的内容
- 不需要安装额外扩展,DOMDocument是PHP默认内置组件,绝大多数运行环境都支持
内容的提问来源于stack exchange,提问作者Milos2504
相关产品推荐
相关产品推荐

