使用:Rails 3.0.3。
我有一个字符串可以看作是这个:
<p>hello, how are you? oh, that's nice! i am glad you are fine. i am too.<br />i am glad to have met you.</p>
我希望每个字符跟随任何<p> <br /> ! ?
. 要大写。基本上让上面的字符串看起来不错。
有标准功能吗?我该怎么办?
附言。试图加粗有问题的字符,但它没有用......
使用:Rails 3.0.3。
我有一个字符串可以看作是这个:
<p>hello, how are you? oh, that's nice! i am glad you are fine. i am too.<br />i am glad to have met you.</p>
我希望每个字符跟随任何<p> <br /> ! ?
. 要大写。基本上让上面的字符串看起来不错。
有标准功能吗?我该怎么办?
附言。试图加粗有问题的字符,但它没有用......
使用 Nokogiri 你可以在文本周围有任何标记,它会在 <br /> 等处中断。
ng = Nokogiri::HTML.fragment("<p>hello, how are you? oh, that's nice! i am glad you are fine. i am too.<br />i am glad to have met you.</p>")
ng.traverse{|n| (n.content = n.content.gsub(/(.*?)([\.|\!|\?])/) { " #{$1.strip.capitalize}#{$2}" }.strip) if n.text?}
ng.to_s
给出:
"<p>Hello, how are you? Oh, that's nice! I am glad you are fine. I am too.<br>I am glad to have met you.</p>"
我使用了两次strip,首先是因为stop/question/exclamation之后的句子会有空格,否则不会大写,然后为了放回空格,我在每个句子之前添加了一个空格-第二个strip删除了开头生成的空格最终输出。
离开 Niklaos 的回答,我稍微改进了它,以考虑到时间段并在呈现的 HTML 中保持间距不变。
str.gsub(/(\<p\>|\<br \/\>|[?!.])([\s]*)([[:alpha:]]{1})/) {"#{$1}#{$2}#{$3.capitalize}"}
编辑:将标点符号添加到单个字符类中,在空格之间捕获所有字符以保留间距。干净多了。
大写是您正在寻找的方法。尽管您必须为每个句子都这样做。如果你不得不这样做,你可以很容易地用 nokogiri 解析它
嗯,我觉得是时候调用超级正则表达式了 :)
str.gsub(/(\<p\>|\<br \/\>|! |\? )(.{1})/) {"#{$1}#{$2.capitalize}"}
那应该是工作。
注意:这可以改进以具有更大的灵活性。