【问题标题】:Escaping characters by doubling them in PHP通过在 PHP 中加倍字符来转义字符
【发布时间】:2011-09-20 13:53:24
【问题描述】:

有没有一种简单的方法可以通过加倍来转义/取消转义 PHP 中的任意字符,例如:

  • 在 ANSI SQL 中,"you can ""escape"" this way"
  • 在 printf() 中,you can express a %% this way

使用str_replace() 转义非常容易,但是反转该过程以取消转义字符串并不是那么容易,所以有人知道一对函数或一个库来做到这一点吗?

这个想法是我需要以这种方式序列化一个数组:

array('a','b', '~','c') => 'a~b~~~~c'

各个字符串不能为空。

更新:刚刚意识到这个“编码”被破坏了,感谢下面有用的 cmets。

【问题讨论】:

  • 你要转义多少个字符?
  • a~b~~~~c 是模棱两可的,所以你问的是不可能的。例如,它可能是两个元素:a,b~~c。为什么不直接使用serialize 或json_encode?
  • 'a~b~~~~c' 这不起作用。 array('a', 'b~~c') 呢?为什么不用serialize()来序列化一个数组呢?
  • @konforce:我考虑了这两种选择,但它们不符合我的确切需求。关于您的评论,没有歧义,并且该过程是 100% 可逆的。 ~ 后面不跟另一个 ~ 是一个分隔符,而 ~~ 是一个普通的 ~ 字符。
  • @Benjamin,array('a','b', '~','c') => 'a~b~~~~c'。 array('a','b~~c') => 'a~b~~~~c'。解释如何让两个输入产生相同的输出并不模棱两可。

标签: php escaping quotes


【解决方案1】:

在我看来

str_replace($char, $char.$char, $string);

和

str_replace($char.$char, $char, $string);

将是彼此的补充。

【讨论】:

  • 我更新了我的问题,以举例说明我需要什么。我想使用 $char 作为分隔符来转换回数组,但希望 $char.$char 被视为单个 $char 而不是两个分隔符。
  • 不确定您能否完成这项工作。您将转义字符用作转义符和分隔符的双重用途。给定~~~~ 是,~,、,,,,、,,~ 等等...
  • ~~~~ 是 ~~,同样的方式 %%%% 在 printf() 中是 %%,"""" 在 ANSI SQL 标识符中是 ""。
  • 抱歉,我现在知道你的意思了。我忘了说各个字符串不能为空,我想这解决了这个问题?
【解决方案2】:

正如几位用户在 cmets 中指出的那样,这个问题是有缺陷的,没有可能的答案。

我的目标的详细解释和适当的答案已在Provide a human-readable representation of an identifier?提供

【讨论】:

    【解决方案3】:

    看看addcslashes() 和stripcslashes,它们可以让你削减你想要的那些字符。这可能会有所帮助。

    除此之外,您的问题并没有真正说明您在取消转义中看到的问题的确切位置,所以除了使用 str_replace 反向之外,我无法提供任何其他内容。

    【讨论】:

    • 我特别不想使用反斜杠。我刚刚用我需要的示例更新了我的问题!
    【解决方案4】:

    将 preg_split() 与

    一起使用
    (?<!-)-(?!-)|(?:-)((?:-{2})+)(?:-)
    

    您必须使用标志 PREG_SPLIT_DELIM_CAPTURE。 经过一番挣扎,我很惊讶实际上有一个正则表达式解决方案。

    a-b----c-hl--g------lo-x
    

    变成

    Array ( [0] => a [1] => b [2] => -- [3] => c [4] => hl--g [5] => ---- [6] => lo [7] => x ) 
    

    【讨论】:

    • 您可能已经注意到我使用了分隔符“-”。发现这更方便一些。 :) 在我的正则表达式中,您可以将“-”替换为任何其他字符,但请记住用反斜杠转义特殊的正则表达式字符。
    • 感谢您的努力,但是当我们就问题 cmets 进行交流时,我意识到问题本身已被破坏(请参阅这些 cmets 了解原因)。
    猜你喜欢
    • 2014-02-15
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多