2011-12-13 7 views
0

그래, 시작 구분 기호와 끝 구분 기호 사이에 데이터를 반환하는 사용자 지정 메서드가 있습니다. 나는 주로 HTML 파일 내에서 데이터를 반환하도록 만들었습니다.strpos가 데이터를 반환하지 않습니다.

url%3Dhttp%253A%252F%252Fdomain.com%252Fvideo%253Fms%253Did%25252Cexpire%25252C 

그리고 그 방법은 다음과 같습니다 :

내가 사용하고 샘플 데이터는

private function getValue($startDelimiter, $endDelimiter, $haystack) 
{ 
    $val = ''; 
    if($pos = strpos($haystack , $startDelimiter)) 
    { 
     $pos += strlen($startDelimiter); 
     while($haystack[$pos] !== $endDelimiter) { 
      $val .= $haystack[$pos]; 
      $pos++; 
     } 
     return $val; 
    } else { 
     return false; 
    } 
} 

나는이

$this->getValue("url%3D", "%2C", $source); 

오류 I과 같은 방법을 사용하고 있습니다 점점 ...

Notice: Uninitialized string offset: 5880 in 
01 내가 URL 디코딩을 사용하고

$this->getValue("url=", ",", urldecode($source)); 

를 사용하는 경우 23,516,

은 ... 그것을 잘 작동합니다.

왜 이런가요?

답변

0

길이가 1 문자 이상인 $endDelimiter을 사용하고 있기 때문일 수 있습니다. 이 문자는 1 문자 이상이므로 $haystack[$pos] !== $endDelimiter에있는 문자는 한 번에 한 문자 씩 확인하면서 $endDelimiter을 찾지 않습니다.

0

이 줄 :

while($haystack[$pos] !== $endDelimiter) { 

은 멀티 문자 %2CendDelimiter에 대해 haystack하나 문자를 확인합니다. 즉, 그것은 결코 일치하지 않을 것입니다.

두 번째 이유는 endDelimiter이 실제로 단일 문자이기 때문입니다.

당신은 N 문자 NendDelimiter의 길이, 같은 것입니다 endDelimiter,에 pos부터 확인해야합니다 : 물론

while (substr ($haystack, $pos, strlen ($endDelimiter) !== $endDelimiter) { 

, 그냥 오프셋을 사용하는 것이 더 쉬울 수 있습니다 버전 strpos을 사용하여 자신의 코드에서 문자열을 탐색하는 대신 종료 구분자를 찾으십시오 (PHP 환경에 현재 액세스 할 수 없으므로 테스트되지 않았지만 희망적으로 작동 할 것입니다 - 최소한 최소한 lea ST는 당신에게 무엇을해야하는지에 대한 아이디어) 제공 : 당신의 문자열에 더 %의 2C가 없습니다

private function getValue ($startDelimiter, $endDelimiter, $haystack) { 
    $pos1 = strpos ($haystack , $startDelimiter); 
    if ($pos1 === false) { 
     return false; 
    } 
    $pos2 = strpos ($haystack , $endDelimiter, $pos1 + strlen ($startDelimiter)); 
    if ($pos2 === false) { 
     return substr ($haystack, $pos1); 
    } 
    return substr ($haystack, $pos1, $pos2 - $pos1); 
} 
+0

이것은 완벽합니다. 고맙습니다. 완전히 그걸 놓쳤다. – GV1

1

, 그래서 그냥 계속 그 때까지 반복은 자세한 내용을 시도하고 실패 문자열의 끝에 도달 그것 때문에 이미 문자열 끝에 있습니다. 당신의 루프에

if ($pos>strlen($haystack)) { 
    return false; 
} 

:

당신은 뭔가를 추가해야합니다.

$ haystack [$ pos]는 단 한 문자이고 $ endDelimiter는 둘 이상의 문자이므로 $ endDelimiter가 하나의 문자 만 아닌 이상 절대로 일치하지 않습니다.

관련 문제