2012-01-14 96 views
1

如何检查字符之前是否存在奇怪或反斜杠? 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 

我要检查字符被转义或不!


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

感谢,

回答

1

\a可能是一样的\\a,但\n肯定是不一样的\\n。如果下一个字符的反斜线解析为特殊序列,则反斜线将用作转义字符。否则,反斜杠只是一个反斜杠。

+0

如何解析它像date()函数?这意味着奇数反斜杠不等于反斜杠? – AHHP 2012-01-14 17:19:32

+0

您需要在字符串文字语法和字符串内容之间进行区分。正如@dgunchev所说,你的字符串是'\ a \ b \\ c',因为\\是\的一个转义序列,'\ a','\ b'和'\ c'不是有效的转义序列。 – Amadan 2012-01-14 17:23:28

1

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

+0

其实我想模拟反斜杠转义。请考虑重写date()函数。所以我需要解析一个字符串,并以奇怪和反斜杠的方式做不同的事情。 – AHHP 2012-01-14 17:48:32

+0

不确定我在这里找到你,但为了使事情更简单,尝试从文本文件中读取输入(逐行说),而不是将其嵌入到代码中。当你嵌入它时,PHP解释器首先处理反斜杠。或者试试: '$ BSL = “\\”;'' $海峡= $ BSL “一个” $ BSL $ BSL “B” $ BSL $ BSL $ BSL “C”;。。。。。。 ' ... – 2012-01-18 23:18:01

1

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

看看strcspn()。这对编写自定义解析函数非常有用。您可以使用\作为停止字符。然后与下一个角色一起行动,如果它是特殊的,或者如果不是,则跳到前面。它也比正则表达式运行得更快。

相关问题