Erlang正则表达式 - html + em dash和en dash

时间:2013-12-28 16:05:39

标签: html regex erlang

鉴于字符串:“......年轻女孩---八个?九个?十个?---来跳舞......”,我想在我的浏览器中返回实际的破折号,例如长短划线。 / p>

但是当我在Erlang源代码中输入此代码以生成html中的字符串时:

Clip1 = re:replace(Clip,“---”,“\ - ”,[global,{return,binary}]),

我在浏览器中看到了这个:

“小女孩 - 八岁?九岁?十岁? - 来跳舞”

如果我为em dash输入“\&#8212”也是一样。

换句话说,返回字符代码而不是我希望看到的字符。

如果我不逃避&在字符代码中我得到了这个:

小女孩--- mdash;八?九?十? --- MDASH;

我在这里做错了什么?

非常感谢,

LRP

3 个答案:

答案 0 :(得分:1)

这里有很多问题:

  • 当您编写字符串文字时,\字符是引号字符,它与字符串文字中的后续字符一起使用。由于引用&没有特殊含义,因此&按原样返回。因此字符串"\&#8212"变为"&#8212"。替换字符串中的&将替换为模式匹配的字符。因此,要在字符串中输入&,您需要编写"\\&#8212"

  • 你不能拥有一个角色&gt;字符串中有255个。如果你想要一个更大的字符,那么它需要是UTF-8编码的。像<<8212/utf8>>这样的操作会创建一个带有UTF-8编码的em破折号的二进制文件。这是re模块的限制,而不是将字符串作为列表,通常使用字符串作为列表允许您直接使用Unicode代码点进行编码。

修改

  • 如果您使用选项re,您会看到列表字符串中包含unicode的未编码的unicode字符。所以:

    21> re:replace(C, "---", [8212], [global,unicode,{return,list}]).
    [46,46,46,121,111,117,110,103,32,103,105,114,108,32,8212,32,
     101,105,103,104,116,63,32,110,105,110,101,63,32|...]
    

    要将结果作为UTF-8编码二进制文件获取,您可以执行以下操作:

    22> re:replace(C, "---", <<8212/utf8>>, [global,unicode,{return,binary}]).
    <<46,46,46,121,111,117,110,103,32,103,105,114,108,32,226,
      128,148,32,101,105,103,104,116,63,32,110,105,110,101,...>>
    

答案 1 :(得分:1)

你不需要正则表达式。

binary:replace(Clip, <<"---">>, <<8212/utf8>>, [global]).

http://erldocs.com/R16B03/stdlib/binary.html?i=26&search=binary:#replace/3

答案 2 :(得分:0)

啊,发现了问题!我没有添加......

<meta charset=\"utf-8\"> 

...到我返回浏览器的html的head部分。完成后,em dash和en dash显示得很好。

许多人感谢慷慨的人们花时间帮我解决问题。 rvirding在我的unicode表达中指出了一个错误,它解决了一个问题; fenolp引导我进入一个很好的二进制替换功能,我现在可以添加到我的技巧包中。

更深层次的问题是:我一直试图重新设计一个Erlang Cowboy REST(rest_pastebin)示例而没有完全理解我正在做的事情。然而,当我将我重新使用的代码与另一个REST示例(rest_hello_world)进行比较时,我发现了问题。所以另外非常感谢那些编写牛仔示例的人。我无法强调精心设计的示例代码对于我们这些想要掌握Erlang的人来说是多么重要。