【问题标题】:Find and replace braced tags within a MySQL table在 MySQL 表中查找和替换大括号标签
【发布时间】:2011-02-08 19:03:41
【问题描述】:

我在该表中有大约 40000 条记录,其中包含纯文本,并且在纯文本中,包含那种标签,其唯一的特点是它们被支撑在 [] 之间

[caption id="attachment_2948" align="alignnone" width="480" caption="the caption goes here"]

我怎样才能删除那些? (替换为无)

如果需要进行清理,我也可以运行一个 PHP 程序。

【问题讨论】:

  • “进行清理” - 所以这是一项一次性的工作,而不是每天必须为数以百万计的请求工作的工作?

标签: php mysql regex replace


【解决方案1】:

试试

$text = preg_replace('/\[\w+(?:\s+\w+="[^"]+")+\s*\]/', '', $text)

注意:

  • 标签内应至少有一个属性(例如,[caption id="attachment_2948"],只有[caption] 不匹配)
  • 属性必须在双引号内 ("attachment_2948")
  • 属性引号内没有\"(这不起作用 - "attachme\"nt_2948"
  • 您可以在属性中包含 [](例如,[caption caption="the [caption] goes here"]
  • 并确保在更改任何内容之前进行了数据库备份。

【讨论】:

  • 我怀疑需要这样一个复杂的正则表达式,因为“它的唯一特点是它们被支撑在 [ ] 之间”
  • @Col。弹片,嗯,你可能是对的,但我只是不希望他的40000条记录因为我而乱七八糟,因为括号[]可以用于其他用途。
  • 这正是我一直在寻找的,非常感谢您的笔记。
【解决方案2】:

在 MySQL 中没有简单的方法可以做到这一点 - 它没有基于正则表达式的替换。最简单的方法是在 PHP 中加载所有行并进行替换,例如:

$result = mysql_query('SELECT * FROM table');
while ($row = mysql_fetch_array($result)) {
   $id = $row['ID'];
   $field = $row['Field'];
   $field = preg_replace('/\[[^\]]+\]/', '', $field); 
   $escaped = mysql_real_escape_string($field);
   $sql = mysql_query('UPDATE table SET Field = ' . $escaped . ' WHERE ID = ' . $id);
} 

【讨论】:

    【解决方案3】:

    就这么简单还是我错过了什么?

    $text = preg_replace('/\[[^[]*\]/', $text);
    

    【讨论】:

      【解决方案4】:

      你需要运行一个 PHP 程序,因为 mysql 没有基于正则表达式的替换。
      '~\[.*?\]~' 模式就足够了

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        • 2014-03-09
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多