Jekyll中用正则匹配替换提取YouTube视频代码遇问题
解决Jekyll正则过滤器捕获组替换输出字面量的问题
你遇到的问题是:Jekyll自定义Ruby过滤器里,传入$6作为替换字符串时,输出的是$6字面量,而非预期的第六个正则捕获组内容。
原因很简单:Ruby的gsub方法在使用字符串作为替换参数时,只识别\1、\6这类格式的捕获组引用;而$1、$6是正则匹配后的全局变量,只能在代码块中使用。你在Liquid模板里传的是$6,原过滤器直接把它当普通字符串处理,所以会输出字面量。
修改过滤器代码即可解决问题,下面是调整后的版本:
module Jekyll module RegexFilter def replace_regex(input, reg_str, repl_str) re = Regexp.new(reg_str) # 处理替换字符串中的$n格式捕获组引用 input.gsub(re) do |_match| repl_str.gsub(/\$(\d+)/) do |_n| eval("$#{$1}") end end end end end Liquid::Template.register_filter(Jekyll::RegexFilter)
这个版本会自动把替换字符串里的$6转换成对应的正则捕获组值,你不需要修改原来的Liquid调用代码,就能正确提取YouTube视频ID。
另外也可以直接把Liquid模板里的$6改成\6,保留原过滤器代码不变,但这种方式需要记住格式差异,通用性不如修改过滤器。
内容的提问来源于stack exchange,提问作者MrHinsh - Martin Hinshelwood
相关产品推荐
相关产品推荐

