2009-11-05 147 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可能是完成整个任务的最有效方式。