使用正则表达式提取HTML替代文字?

时间:2013-11-15 20:51:00

标签: ruby regex

我正在使用Ruby编写an importer for PHPbb to Discourse

整个PHPbb数据库都是像

这样的字符串
<!-- s:( --><img src="{SMILIES_PATH}/rice_frown.png" alt=":(" title="Frown" /><!-- s:( -->
<!-- s:'( --><img src="{SMILIES_PATH}/rice_crying.png" alt=":'(" title="Crying" /><!-- s:'( -->

我需要将字符串替换为alt属性中的符号,因此对于上述内容,我需要:(:'(。我用正则表达式代替其他东西,但我无法得到正确的模式。

2 个答案:

答案 0 :(得分:2)

有大量的库允许您加载HTML。最着名的是Nokogiri,你可以做到

string = '<!-- s:( --><img src="{SMILIES_PATH}/rice_frown.png" alt=":(" title="Frown" /><!-- s:( -->'
alt_str = Nokogiri::HTML(string).css("img").first["alt"]

答案 1 :(得分:1)

人们总是很快指出,you can't completely parse HTML with regex。但是,这并不意味着您无法使用HTML和正则表达式做有用的事情。在你的情况下,这不是一个特别难的问题。试试这个:

<img .*?alt="(.*?)".*?>

只需将这些匹配替换为第一组:

input.gsub /<img .*?alt="(.*?)".*?>/i, '\1'

如果你真的想要超级健壮,你可以把这个正则表达式玩弄一下:

s.gsub /<\s*img .*?al­t\s*=\s*([­"'])(.*?)\­1.*?>/i, '(\2)­'

处理以下变体(注意空格,引号类型和大小写):

< img alt="foo" />
<IMG alt="foo" />
<img alt = "foo" />
<img alt='foo' />

依旧......