假设我有一些文字:
<hello> <world> <:how> are <you>
现在我想对它进行HTML编码,以便<>
不会搞砸。但是<:how>
很特别,因为它里面有:
,所以我不想触及它。
我可以使用类似{{how}}
之类的正则表达式替换它,然后执行HTML编码,然后将其替换回来。
但是如果{{something}}
已经出现在代码的某个地方呢?然后,{{something}}
会在原来保留的情况下转换为<:something>
。
我过去曾经遇到过这个问题几次,但仍然没有找到一个好方法来接近它。人们只是选择一些非常模糊的东西来代替,而希望它在其他地方不存在,或者是否有正确的方法来做到这一点?
答案 0 :(得分:2)
使用regexp进行HTML解析is bad。但是,让我们考虑你只是修改一小段自己的代码。
考虑这个正则表达式:<(?!:)
:它匹配任何未跟<
的{{1}},但冒号不包含在匹配中,因此您只需使用替换字符串:
。
找出您喜欢的文本编辑器中“使用正则表达式”复选框的位置。 (在vi中,它隐含在那里,检查过。)上面的表达式只有在编辑器支持正确的regexp语法时才有效。大部分都在做。
但是你原来的方法也是可行的。如果在regexp中枚举几个复杂的排除模式是不切实际的,那么可以暂时用一些字符串替换这些模式。只是让这些字符串独特。我敢打赌,如果你用<
替换<:
,那么你几乎没有机会与某些东西发生冲突,或者忘记了这个字符串代表什么。是的,这些临时字符串 是一个眼睛:这使你有机会忘记将它们替换回来。“
答案 1 :(得分:1)
您可以基于某些在编码过程中无法生存的字符来实现转义机制。例如,如果您对输入进行html编码,那么在此之后您将不会拥有任何<
或>
个字符,因为它们被html实体替换。
因此,您可以使用由<
或>
组成的字符串作为转义码。如果您要在浏览器中显示最终代码,可以使用<!-- TOKEN -->
之类的代码作为转义码,因为它不会影响可视化。
您的编码过程可能如下所示:
<hello> {{world}} <:how> are <you>
<xxx>
替换为<xxx>
,其中xxx不以:
开头
<hello> {{world}} <:how> are <you>
<:xxx>
替换为{{<!-- TOKEN -->xxx}}
<hello> {{world}} {{<!-- TOKEN -->how}} are <you>
在浏览器中显示{{world}}
和{{how}}
看起来相同,但它们会保留解码信息。实际上,相应的解码过程将是:
<hello> {{world}} {{<!-- TOKEN -->how}} are <you>
{{<!-- TOKEN -->xxx}}
替换为<:xxx>
<hello> {{world}} <:how> are <you>
<xxx>
替换为<xxx>
<hello> {{world}} <:how> are <you>
就像我说的那样,因为基于你的转义代码的字符在编码文本中不能单独出现 ,所以像{{<!-- TOKEN -->how}}
这样的输入不会破坏编码/解码过程,因为它将被编码为{{<!-- TOKEN -->how}}
,因此正确反转。