在查找和替换期间隐藏文本的强大方法?

时间:2011-09-06 22:57:15

标签: string language-agnostic logic

假设我有一些文字:

<hello> <world> <:how> are <you>

现在我想对它进行HTML编码,以便<>不会搞砸。但是<:how>很特别,因为它里面有:,所以我不想触及它。

我可以使用类似{{how}}之类的正则表达式替换它,然后执行HTML编码,然后将其替换回来。

但是如果{{something}}已经出现在代码的某个地方呢?然后,{{something}}会在原来保留的情况下转换为<:something>

我过去曾经遇到过这个问题几次,但仍然没有找到一个好方法来接近它。人们只是选择一些非常模糊的东西来代替,而希望它在其他地方不存在,或者是否有正确的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

使用regexp进行HTML解析is bad。但是,让我们考虑你只是修改一小段自己的代码。

考虑这个正则表达式:<(?!:):它匹配任何未跟<的{​​{1}},但冒号不包含在匹配中,因此您只需使用替换字符串:

找出您喜欢的文本编辑器中“使用正则表达式”复选框的位置。 (在vi中,它隐含在那里,检查过。)上面的表达式只有在编辑器支持正确的regexp语法时才有效。大部分都在做。

但是你原来的方法也是可行的。如果在regexp中枚举几个复杂的排除模式是不切实际的,那么可以暂时用一些字符串替换这些模式。只是让这些字符串独特。我敢打赌,如果你用&lt;替换<:,那么你几乎没有机会与某些东西发生冲突,或者忘记了这个字符串代表什么。是的,这些临时字符串 是一个眼睛:这使你有机会忘记将它们替换回来。“

答案 1 :(得分:1)

您可以基于某些在编码过程中无法生存的字符来实现转义机制。例如,如果您对输入进行html编码,那么在此之后您将不会拥有任何<>个字符,因为它们被html实体替换。 因此,您可以使用由<>组成的字符串作为转义码。如果您要在浏览器中显示最终代码,可以使用<!-- TOKEN -->之类的代码作为转义码,因为它不会影响可视化。

您的编码过程可能如下所示:

  • 输入字符串:
    • <hello> {{world}} <:how> are <you>
  • <xxx>替换为&lt;xxx&gt;,其中xxx不以:开头
    • &lt;hello&gt; {{world}} <:how> are &lt;you&gt;
  • <:xxx>替换为{{<!-- TOKEN -->xxx}}
    • &lt;hello&gt; {{world}} {{<!-- TOKEN -->how}} are &lt;you&gt;

在浏览器中显示{{world}}{{how}} 看起来相同,但它们会保留解码信息。实际上,相应的解码过程将是:

  • 输入字符串:
    • &lt;hello&gt; {{world}} {{<!-- TOKEN -->how}} are &lt;you&gt;
  • {{<!-- TOKEN -->xxx}}替换为<:xxx>
    • &lt;hello&gt; {{world}} <:how> are &lt;you&gt;
  • &lt;xxx&gt;替换为<xxx>
    • <hello> {{world}} <:how> are <you>

就像我说的那样,因为基于你的转义代码的字符在编码文本中不能单独出现 ,所以像{{<!-- TOKEN -->how}}这样的输入不会破坏编码/解码过程,因为它将被编码为{{&lt;!-- TOKEN --&gt;how}},因此正确反转。