PHP奇怪的按位运算符对字符串的影响

时间:2011-06-17 19:06:50

标签: php bitwise-operators

更新..移至new question

好的,在阅读完PHP文档后,现在很清楚这些按位运算符,但是,这是什么?

#dump1
var_dump('two identical strings' | 'two identical strings'); // mind the |
// string(21) "two identical strings"

#dump2
var_dump('two identical strings' ^ 'two identical strings'); // mind the ^
// string(21) ""

为什么#dump2显示长度== 21,但是0个字符?

在Notepad ++中复制时,字符串中没有字符符号,那么strlen > 0怎么样? - 这让我很困惑,因为Notepad ++可以显示某种位级别(至少我认为那些是位级别的,如果我错了就纠正我的话),见图: enter image description here

这实际上来自:

$string = 'i want you to compare me with an even longer string, that contains even more data and some HTML characters, like € ' ^ 'And I am going to add some HTML characters, like € again to this side and see what happens'; // mind the ^
var_dump(htmlentities($string)); // had to add htmlentities, otherwise &gt; (<) characters are added in this case, therefore messing up the output - Chrome force closes `<body>` then
// string(101) "(NA'TAOOGCP MI<<m-NC C IRLIHYRSAGTNHEI   RNAEAAOP81#?"

我很想看到这个#dump2相关的问题得到解答,提前谢谢!


在进行实验时,我发现了这一点:

echo 'one' | 'two'; 
// returns 'o'

echo 'one' | 'twoe';
// returns 'oe'

所以,看到在这两行中它只返回两个字符串中的字母,我认为它做了一些比较或其他:

echo 'i want you to compare me' | 'compare me with this';    
#crazy-line // returns 'koqoveyou wotko}xise me'

写这篇文章时,甚至发生了一些奇怪的事情。我复制了返回的值,并在将其粘贴到post textarea后,当指针位于crazy-line的末尾时,它实际上是右边的一个“空格”而不是它应该的位置。退格时,它会清除最后一个字符,但指针仍然是右边的一个“空格”。

这导致我在Notepad ++中复制这个值:
returned value inside Notepad++
而且,嗯,正如你所看到的,这个字符串中有一个“四四方方”的字符,不会出现在浏览器中(至少在我的,Chrome,最新)。是的,当从该字符串中移除此字符时(通过退格),它将返回正常状态 - 右侧不再有“空格”。

那么,首先,PHP中的这个|是什么,以及为什么会出现这种奇怪的行为?

这个更奇怪的角色是什么,看起来像一个盒子而不会出现在浏览器中?

我非常好奇为什么会这样,所以这里还有一个包含HTML实体的更长字符串的测试:

$string = 'i want you to compare me with an even longer string, that contains even more data and some HTML characters, like &euro; ' | 'And I am going to add some HTML characters, like &euro; again to this side and see what happens';
var_dump($string);
// returns string(120) "inwaota}owo}ogcopave omwi||mmncmwwoc|o~wmrl{wing}r{augcontuonwhmweimorendaweealawomepxuo characters, like € "

最后一个值包含7个'boxy'字符。

3 个答案:

答案 0 :(得分:6)

它是按位OR运算符。

  

如果左手和右手都有   参数是字符串,按位   操作员将对此进行操作   字符的ASCII值。

来源:http://php.net/manual/en/language.operators.bitwise.php

答案 1 :(得分:6)

这是一个按位OR运算符。它在字符串上的行为在这里解释:http://php.net/manual/en/language.operators.bitwise.php#example-107

<?php
echo 12 ^ 9; // Outputs '5'

echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
                 // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0
                        // 'a' ^ 'e' = #4

echo 2 ^ "3"; // Outputs 1
              // 2 ^ ((int)"3") == 1

echo "2" ^ 3; // Outputs 1
              // ((int)"2") ^ 3 == 1
?>

答案 2 :(得分:5)

管道字符|用于按位包含OR比较:

http://www.php.net/manual/en/language.operators.bitwise.php

这是关于它如何处理字符串的前一个SO线程:

How to Bitwise compare a String