HTML Escaping - Reg表达式?

时间:2009-05-05 10:29:57

标签: html regex string escaping

我想HTML自动地逻辑地转义特定的短语,这是当前用带引号突出显示的单词的语句。在声明中,引号或英寸标记也可用于描述距离。

这句话可能是:

  保罗说:“大约一英尺就错过了我们”。事实上它只有大约9英寸。

要逃避这句话它应该是

<pre>Paul said &ldquo;It missed us by about a foot&rdquo;.  
In fact it was only about 9&prime;.</pre>

哪个给出了

<pre>Paul said “It missed us by about a foot”. 
     In fact it was only about 9″.</pre>

我想不出一个样本短语要添加到“逃避中,但那可能就在那里!”

我正在寻找一些关于如何识别哪些转义值在运行时替换“字符”的帮助。这个短语只是一个例子,它可以是任何东西,但应该正确形成,即开始和结束引用会如果我们要正确地逃避文本,请在场。

我会使用正则表达式在文本中找到引用的短语,即在完全停止之前找到两个“”字符,然后替换第一个然后替换第二个。与

&ldquo;

然后

&rdquo;    

如果我找到一个“用一个替换它     “
除非它是在我用

替换它的数字之后
&Prime;

我如何处理句子中的多个引号?

"It just missed" Paul said "by a foot".  

这真的让我感到难过......

<pre>"It just missed" Paul said "by 9" almost".</pre>

正确转义时应阅读上述内容。 (这次我正在展示实际角色)

“It just missed” Paul said “by 9″ almost”.

显然是一个边缘案例,但我想知道在运行时是否可以在不了解内容的情况下逃避这种情况?如果对更明显的短语没有帮助,我们将不胜感激。

6 个答案:

答案 0 :(得分:3)

我会在两次通过中做到这一点:

第一遍搜索任何紧接在数字之前并进行替换的“:”

s/([0-9])"/\1&Prime;/g

根据您正在处理的文本,您可能需要/需要扩展此正则表达式以识别拼写为单词的数字;为了简单起见,我只检查了数字。

通过所有这些照顾,第二遍可以很容易地转换成对的“如你所描述的那样:

s/"([^"]*)"/&ldquo;\1&rdquo;/g

请注意使用[^"]*而不是.* - 我们希望在它们之间找到两组带有任意数量的非双引号字符的双引号。通过添加该限制,处理具有多个引用部分的字符串将不会有任何问题。 (这也可以使用非贪婪的.*?来完成,但是否定的字符类更清楚地表明了你的意图,并且在大多数正则表达式实现中,效率更高。)

一个流浪的,不匹配的“字符串中的某个地方,或第一遍遗漏的英寸标记,当然仍然可能导致问题,但是如果不了解内容,就没有办法避免这种可能性。” p>

答案 1 :(得分:1)

你所描述的基本上是一个隐藏的马尔可夫模型,

http://en.wikipedia.org/wiki/Hidden_Markov_model

你有一组输入符号(你的原始文本和模糊的标点符号),以及一组输出符号(原始文本和更细粒度的标点符号),但没有一种好方法可以在程序上真正观察两者之间的连接办法。你可以编写一些规则来涵盖一些边缘情况,但这基本上不适用于多引号情况。在这种情况下你不能真正使用正则表达式出于同样的原因,但有一个嗯,和一堆训练文本,你可能会做一些相当不错的猜测。

抱歉,如果您正在尝试为部署做好准备,那可能不是很有帮助,但是输入比输出更加模糊,所以您唯一的选择是考虑上下文,这基本上意味着要么是非常冗长的集合规则,或某种机器学习方法。

但是,有趣的问题是 - 看看你能得到什么样的表现会很好。也许某人已经写了一篇论文?

答案 2 :(得分:1)

  

我想知道是否有可能逃脱   这在运行时没有   了解内容?

考虑到你正在为当前在其他文本中编码的标点符号添加语义含义...不,不是真的。

正则表达式至少部分是最简单的工具。我建议在英寸数字的情况下寻找/ \ d +“/。但对于引号分隔符,在你寻找任何其他特殊情况或短语之后,使用算法匹配对可能更容易,例如括号和括号:tokenize和count。然后测试真实世界的输入并进行细化。

但我真的要问:为什么?

答案 3 :(得分:1)

我不确定在不理解句子含义的情况下是否可以这样做。我倾向于怀疑它。

我的第一次尝试将是以下内容。

  • 从左到右穿过字符串
  • 用左右双引号替换双引号,但如果左边有数字则用双引号替换
  • 如果引号在字符串末尾不平衡则返回,直到找到带有双引号的数字,并根据前面的双引号将双引号更改为左或右双引号。

我很确定你很容易失败这个策略。但它仍然是一个简单的例子 - 当您必须处理嵌套的引号时,就会开始努力工作。

答案 4 :(得分:1)

我知道这已经不在了,但您考虑过Mechanical Turk了吗?这是人类擅长的那种问题,目前计算机很糟糕。选择正确的标点符号需要理解句子的含义,因此对于边缘情况,正则表达式必然会失败。

答案 5 :(得分:0)

你可以尝试这样的事情。首先用这个正则表达式替换引号:

"((?:[^"\d]+|\d"?)*)"

而不是英寸标志:

(\d+)"

这是JavaScript中的一个示例:

'"It just missed" Paul said "by 9" almost"'.replace(/"((?:[^"\d]*|\d["']?)+)"/g, "&ldquo;$1&rdquo;").replace(/(\d+)"/g, "$1&Prime;");