【问题标题】:RegEx to update background= URLs正则表达式更新背景 = URL
【发布时间】:2015-01-09 15:57:25
【问题描述】:

我想要做的是更新文档中 HTML 背景标签的 URL。需要注意的是只有本地 URL 应该被更新,所以任何以 http 开头的东西都应该被忽略。

我试图实现的正则表达式需要替换文件名和扩展名之前的路径。比如:

background="image.gif"
background="/image.gif"
background="images/image.gif"
background="images/directory/image.gif"

应该全部输出为:

background="/mydirectory/image.gif"

与往常一样,输入文件中可能同时使用了单引号或双引号。

我已经有一个现有的 RegEx,它正在为 CSS 图像引用做非常相似的工作。正则表达式是:

url\((?:\'|\"")?(?!(?:http|ftp))(?<path>.+)\/(?<filename>.*?)\1?\)

我以为我可以简单地将 url() 匹配替换为 background= 但到目前为止我还没有成功。

非常感谢任何帮助。

【问题讨论】:

    标签: regex


    【解决方案1】:

    See demo here 正则表达式background=['"](?!\s*(http|ftp):\/\/)(?:[^'"]*\/)*(?&lt;filename&gt;[^'"]+)['"]

    详细说明:

    • baground=match 'background=' 字面意思
    • ['"] 匹配任何引用
    • (?!\s*(http|ftp):\/\/) 确保引用后没有 http:// 或 ftp://(即使前面有空格)
    • (?:[^'"]*\/)* 匹配路径,直到文件名仍在引号内时 [^'"]*\/ 包含在非捕获组中,(?:) 可以由 * 重复 0 次或更多次(可以由 ? 替换,因为它将实际上匹配全部或全部不匹配)
    • (?&lt;filename&gt;[^'"]+) 在捕获组文件名中捕获非引号(+quantifier 为非空)的任何内容
    • ['"] 匹配最后一个引号以避免捕获它

    旧答案(以防有人感兴趣): See demo here

    正则表达式是:background=['"](?!\s*(http|ftp):\/\/)\/?(?&lt;filename&gt;[^'"]*)['"]

    详细说明:

    • baground=match 'background=' 字面意思
    • ['"] 匹配任何引用
    • (?!\s*(http|ftp):\/\/) 确保引号后没有 http:// 或 ftp://(即使前面有空格)
    • \/? 匹配前导 / 以避免捕获它(如果存在)
    • (?&lt;filename&gt;[^'"]*) 在捕获组文件名中捕获任何非引号
    • ['"] 匹配最后一个引号以避免捕获它

    替换见demo,不过思路是用/mydir/${filename}替换

    【讨论】:

    • 感谢@Tensibai,这几乎是完美的!唯一的问题是我需要删除源文件名之前的所有内容,例如,此时“/images/directory/image.gif”的输入应输出为“/mydir/images/directory/image.gif”只输出'/mydir/image.gif'。我希望这是有道理的?!
    • 非常感谢您的快速响应 - 我将在星期一早上首先尝试更新的解决方案。非常感谢您的帮助。
    • 抱歉@Tensibai 的回复延迟 - 我现在有机会进行测试,我注意到一个小错误。如果源 HTML 是 '' 输出 HTML 为 ' ' 知道为什么会这样吗?
    • 我在 deosnt 帮助上方的评论中缺少代码格式,但看起来 RegEx 正在更改内联样式的内容。内联样式中的背景图像 URL 由另一个 RegEx 处理,因此这不是问题。非常感谢您对此的帮助。
    • @MowerDance 也许你可能会打开一个新问题,代码格式化会更好。 (并使用正则表达式本身的代码来查看它是否不是竞争条件)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签