0

我试图通过 regex 在某些文本条件周围添加 html 标签。现在,我有 * 和 ** 工作(添加 h1 和 h2 标签)

我对 li 标签有相同的格式,但它在开头旁边添加了结束标签,这不是我想要的。

为什么输出不一样?

:::文本文件::::

* this is an awesome *
** this could be something better **
* another test *
- li are good for lists

::: 结束文本文件 :::

:::我的输出:::

-bash-4.1$ ruby markup.rb testMarkup.txt
<h1>this is an awesome <\h1>
<h2> this could be something better <\h2>
<h1>another test <\h1>
<li><\li>li are good for lists

::结束输出:::

:: 红宝石文件 ::

#!/usr/bin/env ruby

text = IO.read(ARGV[0])

text = text.gsub(/^\*{1}[^*](.*?)\*{1}\s/) do 
  "<h1>" + $1 + "<\\h1>" 
end

text = text.gsub(/^\*{2}(.*?)(\*{2})\s/) do 
  "<h2>" + $1 + "<\\h2>" 
end

text = text.gsub(/^[-](.*?)\s/) do 
   "<li>" + $1 + "<\\li>" 
end
puts text

:: 结束红宝石文件 ::

4

2 回答 2

0

在您的最后一个正则表达式中,/^[-](.*?)\s/您应该$在正则表达式的末尾添加以仅匹配以-开头的整行。

/^[-](.*?)\s/匹配字符串“-”并替换它,保持字符串的其余部分不变。

仅供参考,您可以简化您的解决方案,将其变成更通用的解决方案。用 type 对声明一个哈希Regexp => tag,然后对其进行迭代。你会喜欢的代码!随时寻求进一步的帮助。

PS我猜,您正在尝试将 Markdown 转换为 HTML。尽管自己编写是一个很好的练习,但您可以使用现成的解决方案,例如Maruku

于 2013-02-06T16:27:21.190 回答
0

关键的区别在于,在标签h1和的正则表达式中h2

/^\*{1}[^*](.*?)\*{1}\s/
/^\*{2}(.*?)(\*{2})\s/

要捕获的字符串 match(.*?)必须后跟一个特殊的终止符号\*{1}or \*{2},这让非贪婪匹配等待此类特殊字符,而在正则表达式中为 tag li

/^[-](.*?)\s/

要捕获的字符串只需要后跟一个更通用的字符\s,该字符已经在 之后-,因此非贪婪匹配不会超出此范围。

于 2013-02-06T16:41:29.470 回答