0

我有一个 html 字符串。在该字符串中,我想解析所有<p>标签并应用其他内联样式。

附加样式:style="margin:0px;padding:0px;"或者它可能是别的东西

情况1:

输入字符串:<p>some string</p>

输出字符串: <p style="margin:0px;padding:0px;">some string</p>

案例2:

输入字符串:<p style="text-align:right;" >some string</p>

输出字符串: <p style="text-align:right;margin:0px;padding:0px;">some string</p>

案例3:

输入字符串: <p align="justify">some string</p>

输出字符串:<p style="margin:0px;padding:0px;" align="justify">some string</p>

现在我正在使用这样的正则表达式

myHtmlString.gsub("<p", "<p style = \"margin:0px;padding:0px\"")

除了删除以前的样式外,它工作正常。我正在使用 Ruby (ROR)。

我需要帮助来调整一下。

4

3 回答 3

3

[:style]您可以通过设置相关节点来使用 Nokogiri 执行此操作。

require "nokogiri"

inputs = [
  '<p>some string</p>',
  '<p style="text-align:right;" >some string</p>',
  '<p align="justify">some string</p>'
]

inputs.each do |input|
  noko = Nokogiri::HTML::fragment(input)
  noko.css("p").each do |tag|
    tag[:style] = (tag[:style] || "") + "margin:0px;padding:0px;"
  end
  puts noko.to_html
end

这将遍历与 css 选择器匹配的所有元素p,并根据style需要设置属性。

输出:

<p style="margin:0px;padding:0px;">some string</p>
<p style="text-align:right;margin:0px;padding:0px;">some string</p>
<p align="justify" style="margin:0px;padding:0px;">some string</p>
于 2013-07-01T15:21:02.857 回答
0

我建议不要为此使用正则表达式,因为通常正则表达式无法正确解析 HTML。也就是说,只要您的输入数据是一致的,正则表达式仍然可以工作。您想使用括号匹配p元素style属性中已有的任何内容,然后将其插入替换字符串中:

myHtmlString.gsub(/<p( style="(.*)")?/,
                  "<p style=\"#{$2};margin:0px;padding:0px\"")

以下是匹配模式的工作原理:

/        #regex delimiter
<p       #match start of p tag
(        #open paren used to group, everything in this group gets saved in $1
 style=" #open style attribute
(.*)     #group contents of style attribute, gets saved to $2
"        #close style attribute
)?       #question mark makes everything in the paren group optional
/        #regex delimiter
于 2013-07-01T15:19:49.050 回答
0

我最终做了这样的事情,我必须在发送电子邮件之前这样做。我知道这不是最好的方法,但值得在这里分享。@sgroves 和 @Dobert 提供的解决方案非常好而且很有帮助。

但是我不想包括 Nokogiri,尽管我只从上述 2 个解决方案中选择了这个想法。谢谢。

这是我的代码(我是 ROR 新手,所以这里没什么特别的,我在 HAML 块中使用它)

 myString.gsub!(/<p[^>]*>/) do |match|
   match1 = match
   style1_arr = match1.scan(/style=".*"/)
   unless style1_arr.blank?
     style1 = style1_arr.first.sub("style=", "").gsub(/\"/, "").to_s
     style2 = style1 + "margin:0px;padding:0px;"
     match2 = match1.sub(/style=".*"/, "style=\"#{style2.to_s}\"")
   else
     match2 = match1.sub(/<p/, "<p style = \"margin:0px;padding:0px;\"")
   end
 end

现在myString将更新字符串。(注意 gsub 之后的 !)

于 2013-07-05T16:33:44.520 回答