如何使用正则表达式将字符串转换为HTML标记?

时间:2013-12-27 23:57:19

标签: ruby regex ruby-2.0

我想使用正则表达式将使用自定义语法(我自己的;我正在创建自己的markdown标记)的Markdown字符串转换为HTML标记。我正在使用redcarpet自定义渲染器。

# From
[image:left:xyz]
[xyz]: http://foo.com

# To
<img src="http://foo.com" class="left">

我开始写一个正则表达式,但我觉得很难。我意识到我在跑步之前试图跑步,但是正则表达非常难,即使在尝试学习它们时,这个问题也可能需要几天时间。

主要问题是第二个参数,在本例中为left,它映射到图像类属性:它也可以是rightfullspread

另一个问题是可能有几个字符串,而不仅仅是一个字符串:

string.gsub \A\[(image)(:left)|(:right)(:id) do
  image_tag $1, class: $2 # not sure how to match $1, and $2...
end

3 个答案:

答案 0 :(得分:3)

这将是非常复杂的,但这可以从你开始:

string = '[image:left:xyz]
[xyz]: http://foo.com

[image:right:yzx]
[yzx]: http://foo.com'

urls = {}

string.gsub!(/\[([^:]*)\]: (.*)\s?$/) do
  urls[$1] = $2 # grabbing all urls and their ids
  ''            # replacing them with empty string
end

string.gsub!(/\[image:(.*):(.*)\]/) do
  css_class = $1
  url       = urls[$2]

  image_tag(url, class: css_class)
end

string # =>
# <img src='http://foo.com' class='left' />

# <img src='http://foo.com' class='right' />

随时询问更多详情。

答案 1 :(得分:1)

您可以使用:

string.gsub!(/\[image:(left|right|full|spread):([^\]]+)\]\s*\[\2\]:\s*(\S+)/,'<img src="\3" class="\1"/>')
puts string

答案 2 :(得分:0)

您想要了解的是REGEX Capture组。

将一堆标记放入Rubular并对它们运行正则表达式,这似乎是设法找出问题的最快方法。每当我需要通过任何类型的困难REGEX时,我经常使用它。