将通配符与更新语句一起使用

时间:2013-09-22 20:16:46

标签: mysql

我想更新表中的特定字符串,但字符串本身有变量。所以,

https://www.youtube.com/watch?v=examplevideo

“examplevideo”是一个变量字符串,我想为

中的替换字符串保留
<iframe width="420" height="315" src="https://www.youtube.com/embed/examplevideo"></iframe>

有没有办法在一个更新语句中执行此操作?

所以,表格看起来像这样;

 select messageid,userid, subject, message  from feed_messages;
+-----------+--------+-------------+--------------------------------------------------------------------+
| messageid | userid | subject     | message                                                            |
+-----------+--------+-------------+--------------------------------------------------------------------+
|        74 |     67 | Test        | message                                                            |
|        75 |     67 | Test        | message                                                            |
|        77 |     67 | Test        | message                                                            |
|        78 |     67 | Test        | message                                                            |
|        90 |     70 | How are ya? | message                                                            |
|       106 |     67 | Test        | message                                                            |
|       107 |     67 | Test        | message                                                            |
|       117 |     67 | Test post   | Here's a test post;

https://www.youtube.com/watch?v=GWqD7GyJBVM |
+-----------+--------+-------------+--------------------------------------------------------------------+

我想将所有内容保留在messageid 117的消息字段中,但修改链接以便在发布时嵌入视频。

2 个答案:

答案 0 :(得分:1)

不幸的是,MySQL的本地REGEXP表达式,即使与REPLACE()结合使用,也不足以完成您想要的任务。

在纯MySQL中,除非你使用this set of user-defined functions (UDFs) for MySQL为MySQL语句实现高级正则表达式功能,例如组捕获(这是你需要的),否则这不容易做到。

如果您能够安装这些UID,则可以使用以下内容:

UPDATE `feed_messages` SET
  `message` = REGEXP_REPLACE(
    `message`,
    'https?://www\.youtube\.com/watch\?v=([a-zA-Z0-9-_]{11})[a-zA-Z0-9-_%&=]*',
    '<iframe src="https://www.youtube.com/embed/$1"></iframe>')
WHERE
  `message` REGEXP 'youtube\.com/watch\?v=[a-zA-Z0-9-_]{11}';

如果您无法使用这些UDF,那么这几乎必须在数据库之外完成。例如,在PHP中:

$query = 'SELECT `messageid`,`userid`,`subject`,`message` FROM `feed_messages`';
$msgs = $mysqli->query($query);
while ($row = $msgs->fetch_assoc()) {
  echo preg_replace(
    $row['message'],
    '/https?://www\.youtube\.com/watch\?v=([a-zA-Z0-9-_]{11})[a-zA-Z0-9-_%&=]*/im',
    '<iframe width="420" height="315" src="https://www.youtube.com/embed/$1"></iframe>')
}

希望这有帮助!

答案 1 :(得分:0)

您可以使用SUBSTRING_INDEX来确定字符串“https://www.youtube.com/watch?v=”的位置,然后再次执行此操作以获取下一个空格的位置。通过这两个位置,您可以提取视频ID并组合Leonid的替换和CONCAT来插入打开和关闭iframe标记。