如何在Perl或Ruby中替换和倍增img标签的尺寸?

时间:2012-03-23 12:34:22

标签: html ruby regex perl

我有一个文件夹,里面装满了为Kindle电子书创建的html文件。根据Kindle指南,图像按宽度和高度编码:

<img width="328" height="234" src="images/224p_fmt.jpeg" alt="224p.tif"/>

我需要创建/查找的是一个脚本,它将处理所有图像标记,将width和height属性的宽度乘以指定的量(编码到脚本中),然后将它们写回html文件。

所以,对于上面的例子,假设我想乘以1.5,并结束

<img width="492" height="351" src="images/224p_fmt.jpeg" alt="224p.tif"/>
像这样的脚本不是我的强项,所以帮助升值。我特别不清楚如何编写一个脚本,我可以从命令行运行文件,只输入/输出html。

我认为代码的内容类似于

s/<img width="([0-9]+)" height="([0-9]+)" src="(.*?)" alt=".*"/>/'<img width="'.$1*1.5.'" height="'.$2*1.5.'" src="'.$3.'" alt=""/>'/eg;

我意识到这是不正确的(乘法部分),这就是为什么有所帮助。

4 个答案:

答案 0 :(得分:2)

你已经找到了主要的正则表达式,只需要调整它并决定一种语言。在html上使用正则表达式并不是最优的,但由于这有点简单,所以可能没问题。

perl -pi.bak -we 's/<img width="([0-9]+)" height="([0-9]+)"/q(<img width=") . 
    $1*1.5 . q(" height=") . $2*1.5 . q(")/eg;' yourfile.html

请注意使用备用引号q(...),因为在命令行中使用单引号会与shell引用冲突。

除非您觉得需要进行更严格的匹配,否则无需触摸任何您不会改变的部分。如果这样做,您可以添加一个预见断言:

(?=\s*src=".*?"\s*alt=".*?"\/>)

这部分将通过替换保持不变。

答案 1 :(得分:1)

在Python中,我会这样做。

import sys, re

source = sys.stdin.read()
def multi(by):
  def handler(m):
    updated = int(m.group(2)) * by
    return m.group(1) + str(updated)
  return handler

print re.sub(r'((?:width|height)=["\'])(\d+)', multi(1.5), source)

然后您可以使用<>处理命令的输入和输出。

$ python resize.py < index.html > new_file.html

答案 2 :(得分:0)

我会研究使用nokogiri gem来解析HTML,搜索图像标签,提取宽度和高度属性,然后输出已更改的文档,以便保存它。

nokogiri tutorial page上的更多信息。

答案 3 :(得分:0)

你说得对,可以用一个小的Ruby脚本来完成。它看起来像这样:

source = '<img width="328" height="234" src="images/224p_fmt.jpeg" alt="224p.tif"/>'
datas = source.scan(/<img width="([0-9]+)" height="([0-9]+)" src="(.*?)" alt=".*">/).flatten!
source.gsub!(data[0], (data[0].to_i * 1.5).to_s)
source.gsub!(data[1], (data[1].to_i * 1.5).to_s)

当然,这是一个快速而肮脏的剧本,远非完美而且有一些缺点。