2011-12-13 150 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); 

錯誤我正在得到的是

Notice: Uninitialized string offset: 5880 in 

如果我使用的URL解碼,然後用

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

...它工作正常。

這是爲什麼?

回答

0

難道這是因爲您使用的長度大於1個字符的$endDelimiter。由於這是超過1個字符,並且您在$haystack[$pos] !== $endDelimiter中檢查,因爲您一次檢查1個字符,它不會找到$endDelimiter

0

這條線:

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

將檢查haystack一個字符對多字符的%2CendDelimiter。換句話說,它永遠不會匹配。

你的第二個工作原因是因爲endDelimiter實際上是單個字符。

您需要檢查開始N字符在posendDelimiter,其中NendDelimiter的長度,是這樣的:

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

當然,可能更容易只使用偏移版本strpos來定位結束分隔符,而不是在自己的代碼中遍歷字符串(這是未經測試的,因爲此刻我的PHP環境對我來說是不可訪問的,但希望按原樣工作 - 最低限度,它應該在lea ST給你做什麼的想法):

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

。在你的字符串中沒有%2C,所以它只是不斷地迭代,直到它到達字符串,然後試圖瞭解更多和失敗結束,因爲它已經在字符串的末尾。

您應該添加類似:

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

進入你的循環。

而且$草垛[$ POS]是隻有一個字符,而$ endDelimiter不止一個字符,這樣不會匹配,除非你的$ endDelimiter只有一個字符。