php right strstr에 대한이 호출이 왜 false가 아닌가?




php text in string (2)

짧은 답변

strstr($str, 2660) 을 실행하면 $needlechr(2660) 을 호출하여 문자 " d " 로 해석되므로 주어진 $str 에있는 첫 번째 " d " 에서 멈 춥니 다.이 경우에는 11 번째 문자.

왜 우리는 chr(2660) 이라고 chr(2660) ?

$needle 이 문자열이 아닌 경우 strstr 은 해당 인수를 정수로 변환하고 확장 ASCII 코드 에서 해당 위치의 문자를 사용합니다. 여기서 chr(2660)" d " 입니다.

needle이 문자열이 아니면 정수로 변환되어 문자의 서수 값으로 적용됩니다.

그러나 " d "ord(100) chr(2660) " d "를 반환하는 이유는 무엇입니까?

유효한 범위 [0-255] 이외의 값은 비트 단위로 255 로 처리되고 다음 알고리즘 [source] 과 동일합니다 [source]

while ($ascii < 0) {
    $ascii += 256;
}
$ascii %= 256;

따라서 2660100 이되고 strstr 전달되면 문자의 서수 값으로 사용되며 문자 " d "를 찾습니다.

혼란스러워? . 나는 또한 그것이 문자열로 형변환 될 것으로 예상했지만 프로그래밍에서 물건을 추측하기 위해 얻은 것입니다. 최소한 이것은 문서화되어 있습니다. 당신은 이상한 일이 일어나는 시간을 놀라게 될 것이고 공식적인 설명은 발견되지 않을 것입니다. 적어도 당신이 제공 한 동일한 링크를 따르는 것만 큼 쉽지는 않습니다.

왜 이름이 strstr 입니까?

나는 약간의 연구를했고 논리적 인 접두어 str 을 가진 문자열에 관련된 모든 함수를 명명 한이 보석 (정보 시스템 프로그래밍 언어 - C에 대한 이론적 근거)을 1989 년 str 발견했습니다. PHP의 소스는 C로 작성 되었기 때문에 PHP가 제공 한 이유를 설명합니다. 내 가장 좋은 추측은 우리가 다른 str ing 안에 str ing을 찾고 있다는 것입니다.

strstr 기능은위원회의 발명이다. 효율적인 하위 문자열 알고리즘 또는 기본 제공 하위 문자열 명령어의 후크로 포함됩니다.

유용한 문서

나는 오래된 레거시 코드베이스에서 strstr 문제를 발견했다. 코드가 많지만 기본적으로 테스트 케이스는 다음과 같습니다.

$value = 2660;
$link = 'affiliateid=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27';

var_dump(strstr($link, $value));

"2660"은 문자열에 없으므로 false 를 반환 할 것으로 예상되지만 d=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27 됩니다.

$value 은 문자열이어야하지만 여전히 PHP가 문자열에 캐스트되지 않은 이유와 링크에서이 숫자를 찾는 이유를 이해하지 못합니다.

실제로, 내가 $value = '2660'; 시도하면 $value = '2660'; 예상대로 false 를 반환합니다.

어떤 생각인지 알 겠어?


이 질문에 대한 답변 :

바늘
needle이 문자열이 아니면 정수로 변환되어 문자의 서수 값으로 적용됩니다.

strstr

의견 때문에 편집 :

chr(2660) 은 haystack에 실제로있는 문자 d 반환하므로 예상 한 것처럼 false를 반환하지 않습니다.





strstr