【问题标题】:Differences between single and double backslashes单反斜杠和双反斜杠的区别
【发布时间】:2012-02-10 10:33:32
【问题描述】:

如何检查字符前是否有奇数或偶数反斜杠? PHP 看到单反斜杠和双反斜杠是一样的! 请看下面的代码:

$str = "\a\\b\\\c";
echo preg_replace("/\\\/", "+", $str); // +a+b++c
echo preg_replace("/\x{005c}/u", "+", $str); // +a+b++c

echo strlen($str); // 7
for($i=0; $i<strlen($str); $i++)
    echo bin2hex($str{$i}).', ';
// Output: 5c, 61, 5c, 62, 5c, 5c, 63

我要检查字符是否被转义!


如何检查这两个字符串之间的差异:“\a”、“\\a”? 像 date() 函数。

谢谢,

【问题讨论】:

    标签: php string comparison pcre backslash


    【解决方案1】:

    \a 可能与\\a 相同,但\n 绝对与\\n 不同。如果带有下一个字符的反斜杠解析为特殊序列,则反斜杠充当转义字符。否则,反斜杠只是一个反斜杠。

    【讨论】:

    • 如何像 date() 函数一样解析它?这意味着奇数反斜杠不等于偶数反斜杠?
    • 您需要区分字符串文字语法和字符串内容。正如@dgunchev 所说,您的字符串是\a\b\\c,因为\\ 是\ 的转义序列,而\a\b\c 不是有效的转义序列。
    【解决方案2】:

    您的字符串实际上是\a\b\\c - \a 是无效的转义序列,因此它变为\a,但是尝试\n,它是有效的,以查看差异。

    【讨论】:

    • 其实我想模拟反斜杠转义。请考虑重写 date() 函数。所以我需要解析一个字符串,并以不同的方式用奇数和偶数反斜杠做一些事情。
    • 不确定我是否能把你带到这里,但为了让事情变得更简单,请尝试从文本文件中读取你的输入(比如逐行),而不是将其嵌入代码中。当您嵌入它时,PHP 解释器首先处理反斜杠。或者试试:$bsl = "\\";$str = $bsl."a".$bsl.$bsl."b".$bsl.$bsl.$bsl."c"; ...
    【解决方案3】:

    简短的回答是您不能使用正则表达式。您不能进行保证这一点所需的可变长度后视断言。我设法编写了一个正则表达式,它在查找此类字符串方面做得非常好,甚至使用一次性子模式进行了优化,但它偶尔会导致缓冲区溢出并在发生大量匹配时使脚本崩溃。

    看看strcspn()。它非常适合编写自定义解析函数。您可以使用\ 作为您的停止字符。然后对于下一个角色,如果它很特殊,就采取行动,如果不是,就跳到前面。它的运行速度也比正则表达式快。

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多