【问题标题】:Replace html style attribute with an MySQL query用 MySQL 查询替换 html 样式属性
【发布时间】:2019-08-13 12:11:39
【问题描述】:

我们正在更新现有的 WordPress 网站并将帖子从一个站点导入到另一个站点。在旧网站上,我们使用了所见即所得的编辑器,所有帖子都嵌入了样式

例子:

<p style="margin: 6px 0px; color: rgb(20, 24, 35); font-family: helvetica, arial, 'lucida grande', sans-serif; font-size: 14px; line-height: 19.3199996948242px; background-color: rgb(255, 255, 255);">
    <span style="font-family: helvetica, arial, 'lucida grande', sans-serif; font-size: 14px; letter-spacing: 0.4pt; line-height: 19.3199996948242px;">Content</span>
</p>

预期输出:

<p>
    <span>Content</span>
</p>

现在我正在寻找一种从 html 元素中删除样式标签的方法。我自己正在考虑一个 MySQL 查询,但无法弄清楚如何在其中进行 preg_replace。

【问题讨论】:

  • 你想删除整个样式属性,它只是它的一部分吗?您能否举例说明您希望达到的最终结果?
  • 更新了问题和预期的输出。
  • 另外能否提供您目前使用的SQL?
  • 那么查询应该是这样的 UPDATE wp_posts SET post_content = replace(post_content, 'HERE REGEX', ''); 。我只需要找到正确的方式来 rexeg post_content
  • 关于您的示例,您是否希望它用类属性替换内联样式,或者没有此类属性,并且使用复杂的 CSS 选择器来完成这一切,可能涉及 :nth-child?

标签: mysql sql wordpress


【解决方案1】:

如果您想在数据库级别执行迁移,我建议您在post 表中添加一个新列,以便您可以先创建旧数据的副本,然后比较迁移脚本的结果。添加新列后,您可以使用REGEXP_REPLACE 作为 UPDATE 的一部分将数据复制到新列中。您可能需要更改正则表达式语法,以便它捕获您在“样式”部分遇到的所有字符,但这可能是一个开始:

UPDATE 
  post_table 
SET 
  stripped_text = regexp_replace(original_text, 
  ' style="[[:alnum:][:digit:][:space:];,:\(\)\'\-\.]+"', '') 

检查数据,看看结果是否OK,重复直到结果足够好。将您的原始帖子列(在我的示例中为“original_text”)重命名为“orignal_backup”,将您的新列(在我的示例中为“stripped_text”)重命名为原始帖子列的名称。

有关 MySQL REGEX 中字符类的更多信息,请访问here

【讨论】:

  • 这可能是我最好的选择,需要先更新到 8.0+。在此之前将保持问题开放。
【解决方案2】:

惰性量词很重要: style="[\d\D]*?"

在 MySQL 中,您需要添加一个额外的反斜杠:style="[\\d\\D]*?"

编辑: MYSQL查询:

update table 
   set column = REGEXP_REPLACE(column,'style="[\\d\\D]*?"','')

【讨论】:

    【解决方案3】:

    您使用的是 WordPress,所以我可以假设您具备一些 PHP 技能吗?如果是这样,您可以使用 simpleXML 之类的东西来扫描所有页面并让递归循环遍历 let say 或 的所有子标签。或者,您可以加载一个 Javascript/jQuery 脚本,该脚本会删除所有样式属性 onload。您可以使用 MySQL 查询来执行此操作,但我认为这样做的风险更大。使用 simpleXML 和 Javascript 方法,您可以限制删除的范围。使用 MySQL 中的查找和替换,它在页面和页面的 DOM 中都是无限的。

    我不擅长正则表达式,但如果这是你想要的,请看这里 How to do a regular expression replace in MySQL?

    【讨论】:

    • 感谢您的回答,但结果来自数据库后无需更改,这会给页面增加不必要的负载。对我来说最好的就是直接在数据库中替换它。
    • 你误会了。或者更确切地说,我并不清楚。在没有样式的情况下加载页面后,您可以将该源复制到新站点。或者更好的是,构建一个爬虫来为你做这件事。
    • 啊,那不行,因为我需要前端没有显示的值,所以从 WordPress 导入工具是唯一的方法。一种选择是在导入 XML 中进行替换,但这似乎是一种蛮力的方法。
    • SimpleXML 可以在那里工作......然后一个像样的文本编辑器也可以使用正则表达式查找和替换。
    【解决方案4】:

    其实很简单。您可以设置默认样式,并在从 mysql 更新变量中获取一个后:

    <?php
    
    $NewStyle=' style="background-color: red;"';
    
    //your query to get style
    
    $NewStyle=' style="'.$row['style'].'"';// if some query conditions - example: background-color: blue 
    
    <div '.$NewStyle.'></div>
    
    ?>
    

    编辑:我实际上没有正确阅读并跳过它是关于 WP 的。因为总有一天它仍然会有所帮助,所以我会保留这个答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2011-07-24
      相关资源
      最近更新 更多