2009-11-05 182 views
0

我有一個這樣的字符串,我需要從提取地址:比較數組值

$string="xyz company 7 th floor hotel yyyy 88 main Road mumbai 400000 this is sample comapny address 9456 and some other"; 

$word=str_word_count($string,1,'0...9'); 

現在word有一個像word[0]=xyz每個字,word[1]=companyword[2]=7

我需要比較每個值。如果這個單詞是一個數字,那麼我想將它保存在一個臨時變量中,直到我得到另一個數字。
例如word[2]是7,所以我需要保存從那裏的值直到88在一個臨時變量。所以臨時應該包含"7 th floor hotel yyyy 88"

如果temp變量少於25個字符,那麼我們比較,直到我們得到另一個數字。所以在這裏我們需要繼續從88到400000,並將其附加到臨時變量。

的溫度應該最終是這樣的:"7 th floor hotel yyyy 88 main Road mumbai 400000"

任何幫助嗎?

+0

這似乎不是一種非常可靠的識別地址的方法。即使如此,我還是會用一個正則表達式來拉出你正在尋找的字符串。 – devinfoley 2009-11-05 17:52:52

+0

達到40000並且temp變量超過25個字符後,接下來會發生什麼? 我建議使用preg_split和正則表達式。像(^ \ d + \ s + \ d + $){1,25},但我不明白你想要做什麼。 – 2009-11-05 17:54:20

回答

0

嘗試使用preg_match_all()

if (preg_match_all('!(?<=\b)\d\b+.*\b+\d+(?<=\b)!', $string, $matches)) { 
    echo $matches[0][0]; 
} 

這是什麼做的數字後跟任意數目的字符後面數字的另一個序列的序列測試。表達式很貪婪,所以中間模式(。*)應儘可能多地抓住,這意味着您將從第一組數字抓取。

在那裏有一個前瞻和lookbehind來檢查數字是否在字邊界。您可能需要或可能不需要,您可能需要也可能不需要調整它,具體取決於您的具體要求。

上面的工作對整個字符串。

如果你必須(或只是喜歡)對詞進行操作:

$start = false; 
$last = false; 
$i = 0; 
foreach ($words as $word) { 
    if (is_numeric($word)) { 
    if ($start === false) { 
     $start = $i; 
    } 
    $last = $i; 
    } 
    $i++; 
} 
$word_range = $words; 
array_splice($word_range, $start, $last - $start + 1); 
$substring = implode(' ', $word_range); 
+0

我相信'echo $ matches [0]'會打印一個未找到異常的數組索引或單詞'Array'。由於您使用'preg_match_all',因此您必須使用$ matches [0] [0]才能獲得第一個匹配。 – 2009-11-05 18:13:11

+0

@Steven:很對,固定。謝謝。 – cletus 2009-11-05 18:15:36

1

這個問題已經問here,在那裏我回答。雖然preg_match不符合您的思維過程,但它會完成您正在尋找的結果。你在這個問題和這個問題之間唯一的變化是25個字符的限制。這可以容易地通過檢查終端號碼之前接受任何類型的25個字符來解決:

preg_match('/[0-9]+.{0,25}[^0-9]*[0-9]+\s/',$string,$matches); 
return $matches[0]; 

沒有必要使用str_word_count。如果您堅持使用它,請在評論中說明,我們可以嘗試使用您的思維過程來提供解決方案。然而,preg_match可能是完成整個任務的最有效方式。