2009-05-05 35 views
4

我想HTML自动和逻辑地转义一个特定的短语,目前是一个单词用双引号加亮的语句。在声明中,报价或英寸标记也可用于描述距离。HTML转义 - Reg表达式?

这句话可能是:

保罗说:“这错过我们通过约一英尺。”事实上,只有约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”.

显然边缘的情况下,但我不知道是否有可能逃离这个在运行时没有内容的理解?如果对更明显的短语不会有所帮助,将不胜感激。

回答

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;"); 
1

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

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

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

对不起,这可能不是非常有用,如果你试图做好部署准备工作,但输入比输出有更多的含糊不清,所以你唯一的选择是考虑上下文,这基本上意味着要么很长一套规则或某种机器学习方法。

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

1

我想知道是否有可能在运行时跳过 而没有 了解内容?

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

正则表达式将是最简单的工具,至少它的一部分。我建议在英寸数字的情况下查找/ \ d +“/,但对于引号分隔符,在查找其他特殊情况或短语后,使用匹配对的算法可能会更容易,例如括号和支架:记号化和计数然后在真实世界的输入测试和改进

但我真的要问:?为什么

3

我会分两次做到这一点:

第一遍搜索对于任何紧接在数字前面并且进行替换的人:

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

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

与所有那些照顾,第二遍就可以很容易地转换对“S为你所描述:

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

注意使用[^"]*而非.* - 我们要找到两组双引号,它们之间有任意数量的非双引号字符。通过添加该限制,处理具有多引号段的字符串将不会出现任何问题(也可以使用非引号段-greedy .*?,但一个否定的角色类更清楚地表明你的意图d,在大多数正则表达式实现中,效率更高)

一个流浪,不匹配的字符串中的某个位置,或者第一遍错过的英寸标记当然可能会导致问题,但是没有办法为了避免这种可能性而不理解内容。

+0

+1先做Prime符号。这正确处理了“通过9”几乎“的情况。 – 2009-05-05 12:20:26

1

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

我的第一次尝试是以下。

  • 由左到右通过串
  • 相间左右双引号代替双质数,但随着双撇号代替,如果有一个数向左
  • 如果引号是不平衡在字符串的末尾返回,直到找到具有双素数的数字,并根据前面的双引号将双素数更改为左或右双引号。

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

1

我知道这是关闭的,但你有没有考虑过Mechanical Turk?这是人类擅长的问题,而电脑目前在这方面非常糟糕。选择正确的标点符号需要理解句子的含义,所以正则表达式必然会在边缘情况下失败。