我正在使用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属性中的符号,因此对于上述内容,我需要:(
和:'(
。我用正则表达式代替其他东西,但我无法得到正确的模式。
答案 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 .*?alt\s*=\s*(["'])(.*?)\1.*?>/i, '(\2)'
处理以下变体(注意空格,引号类型和大小写):
< img alt="foo" />
<IMG alt="foo" />
<img alt = "foo" />
<img alt='foo' />
依旧......