我想使用正则表达式将使用自定义语法(我自己的;我正在创建自己的markdown标记)的Markdown字符串转换为HTML标记。我正在使用redcarpet自定义渲染器。
# From
[image:left:xyz]
[xyz]: http://foo.com
# To
<img src="http://foo.com" class="left">
我开始写一个正则表达式,但我觉得很难。我意识到我在跑步之前试图跑步,但是正则表达非常难,即使在尝试学习它们时,这个问题也可能需要几天时间。
主要问题是第二个参数,在本例中为left
,它映射到图像类属性:它也可以是right
,full
或spread
另一个问题是可能有几个字符串,而不仅仅是一个字符串:
string.gsub \A\[(image)(:left)|(:right)(:id) do
image_tag $1, class: $2 # not sure how to match $1, and $2...
end
答案 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时,我经常使用它。