【问题标题】:HTML Escaping - Reg expressions?HTML转义 - 正则表达式?
【发布时间】:2009-05-05 10:29:56
【问题描述】:

我想以 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;

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

“它只是错过了”保罗说“差一点”。 

这真的会难倒我.....

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

正确转义后应读取上述内容。 (这次我展示的是真实人物)

“它只是错过了”保罗说“差点 9”。

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

【问题讨论】:

    标签: html regex string escaping


    【解决方案1】:

    我会分两次这样做:

    第一遍搜索任何紧跟在数字前面的 "s 并进行替换:

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

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

    处理完所有这些后,第二遍就可以轻松转换成对的 "s,如您所描述的:

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

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

    当然,字符串中某处的杂散、不匹配的 " 或第一次传递时遗漏的英寸标记仍然会导致问题,但如果不实施对内容的理解,就无法避免这种可能性。

    【讨论】:

    • +1 用于先做 Prime 符号。这可以正确处理“几乎是 9”的情况。
    【解决方案2】:

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

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

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

    抱歉,如果您要准备好部署的东西,这可能不是很有帮助,但是输入比输出有更大的歧义,所以您唯一的选择是考虑上下文,这基本上意味着要么是一个非常冗长的集合规则,或某种机器学习方法。

    不过是一个有趣的问题 - 看看你能得到什么样的表现会很好。也许有人已经在上面写过论文?

    【讨论】:

      【解决方案3】:

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

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

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

      但我真的要问:为什么?

      【讨论】:

        【解决方案4】:

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

        我的第一次尝试如下。

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            比英寸符号:

            (\d+)"
            

            这是一个 JavaScript 示例:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多