【问题标题】:Regex to replace %2B with underscore in filenames正则表达式用文件名中的下划线替换 %2B
【发布时间】:2012-09-29 00:49:10
【问题描述】:

我正在尝试用_ 替换文件名中出现的所有%2B。

例如:

之前:/wp-content/uploads/2012/10/Moreton%2Bwindow.jpg

之后:/wp-content/uploads/2012/10/Moreton_window.jpg

在/wp-content/uploads/2012/10/和.jpg之间可能会出现很多%2B。

这是我目前所拥有的:

(?<=\/wp-content\/uploads\/2012\/10\/.)(%2B)(?=.\.jpg)

替换为: _

但它不起作用。我将在 MySQL 中进行此替换。

【问题讨论】:

    标签: mysql regex replace


    【解决方案1】:

    我不相信 MySQL 支持基于正则表达式的字符串替换——我在文档中没有看到类似的东西——但你可以写一个这样的表达式:

    CASE WHEN path_plus_filename REGEXP '^/wp-content/uploads/2012/10/.*[.]jpg$'
         THEN REPLACE(path_plus_filename, '%2B', '_')
         ELSE path_plus_filename
     END
    

    它返回path_plus_filename,但如果(且仅当)整个事物与^/wp-content/uploads/2012/10/.*[.]jpg$ 匹配,则将每个%2B 替换为_。

    或者,如果你想要一个UPDATE 语句而不是一个查询,你可以这样写:

    UPDATE table_that_contains_path_plus_filename_column
       SET path_plus_filename = REPLACE(path_plus_filename, '%2B', '_')
     WHERE path_plus_filename REGEXP '^/wp-content/uploads/2012/10/.*[.]jpg$'
    ;
    

    编辑添加:顺便说一句,这既不是这里也不是那里,但是 - 你的正则表达式的问题是它要求 %2B 前面有 /wp-content/uploads/2012/10/ 加上 正好一个字符,然后正好两个字符加上jpg。要在允许的字符数方面获得一些灵活性,您需要使用.*(“零个或多个字符”)或.+(“一个或多个字符”)或.{5,20}(“五个到二十个字符”)字符") 之类的。

    【讨论】:

    • 谢谢,但我遇到了麻烦 - 如果我这样做:SELECT * FROM wp_posts WHERE post_content REGEXP '.*/wp-content/uploads/2012/10/.*[。 ]jpg$' 它不返回任何行,但如果我省略 '[.]jpg' 它可以工作.. 但我需要 .jpg 位在其中
    • 再想一想,我认为 SQL 查询方法行不通,因为我只想替换包含“%2B”的图像文件路径,而不是可能包含它的 HTML 链接。使用 UPDATE 函数不仅会替换图像路径中的字符串,还会替换链接中的字符串,它们存在于同一个表格单元格中。我猜如果 MySQL 不能支持 REGEX 替换,那么它就无法完成。
    • @JoeSmalley:是的,$ 的意思是“字符串结尾”。我没有意识到这个领域不仅仅是图像路径。这使得这变得更加困难。我认为您必须编写一个真正检查值并更智能地执行替换的存储过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多