防止Ruby改变&到&?

时间:2016-07-14 19:14:38

标签: ruby-on-rails ruby

我需要在我的网页标题中显示一些上标和下标字符。我有一个帮助方法,可以识别下标或上标的模式,并将其转换为& sub2;或²

但是,当它出现在渲染页面的文件中时,它会在源代码中显示为:

&sub2;

哪个不对。我把它设置为:

<% provide(:title, raw(format_title(@hash[:page_title]))) %>

但原料不起作用。任何帮助表示赞赏。

方法:

def format_title(name)
label = name
if label.match /(_[\d]+_)+|(~[\d]+~)+/
  label = label.gsub(/(_([\d]+)_)+/, '&sub\2;')
  label = label.gsub(/(~([\d]+)~)+/, '&sup\2;')
  label.html_safe
else
  name
end

我甚至尝试过:

str.gsub(/&amp;/, '&')

但它回馈:

&amp;amp;sub2;

2 个答案:

答案 0 :(得分:0)

您也可以使用Rails I18n实现此目的。

shiftLeft

并在您的相应区域设置文件中。 (<%= t(:page_title_html, scope: [:title]) %> 最有可能):

title.en.yml

以下是关于下标和上标的HTML symbols图表。

有关详细信息,请查看Preventing HTML character entities in locale files from getting munged by Rails3 xss protection

<强>更新

如果您需要动态加载页面标题,首先,您必须安装像Page Title Helper这样的宝石。

您可以按照gem文档中的指南进行操作。

答案 1 :(得分:0)

你的例子有两个问题,一个是问题,另一个只是巧合。

第一个问题是您正在尝试使用实际不存在的字符实体。具体来说,只有&sup1;&sup2;&sup3;提供 1 2 3 分别是上标符号。没有&sup4;这样的字符实体,也没有任何其他上标数字。虽然您可以使用其他数字的裸代码点,但这需要更复杂的代码。

更重要的是,HTML5 character entities list中根本没有下标字符实体。所有下标数字都是裸码点。因此用&sub2;或任何其他&#34;下标&#34;替换任何东西是没有意义的。数字。

您没有看到示例正常工作的原因是您选择的测试字符串。提供带有下划线的任何内容(例如_2_mystring)都将被&sub2;正确替换。由于&sub2;字符实体不存在,字符串将按原样显示,从而产生raw方法无法正常工作的印象。

尝试使用~2~mystring,它将替换为上标字符实体&sup2;,并将正确呈现。这说明您的代码是正确的,但关于字符实体的基本假设不是。