我有一个这样的字符串,我需要从中提取地址:
$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]=company
,word[2]=7
等。
我需要比较每个值。如果单词是一个数字,那么我想将它保存在临时变量中,直到我得到另一个数字
例如word[2]
是7,所以我需要在temp变量中保存从那时到88的值。因此,temp应包含"7 th floor hotel yyyy 88"
。
如果temp变量少于25个字符,那么我们比较直到得到另一个数字。所以这里我们需要保持从88到400000并将其附加到临时变量。
临终应该是这样的:"7 th floor hotel yyyy 88 main Road mumbai 400000"
请帮忙吗?
答案 0 :(得分: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
可能是完成整个任务的最有效方式。
答案 1 :(得分:0)
尝试使用preg_match_all()
:
if (preg_match_all('!(?<=\b)\d\b+.*\b+\d+(?<=\b)!', $string, $matches)) {
echo $matches[0][0];
}
这是在测试一系列数字,后跟任意数量的字符,后跟另一个数字序列。表达式是贪婪的,所以中间模式(。*)应尽可能多地抓取,这意味着你将从第一组到最后一组数字抓取。
在那里有一个前瞻和后视,以检查数字是否在字边界上。您可能需要也可能不需要此功能,您可能需要也可能不需要根据具体要求进行调整。
上述内容适用于整个字符串。
如果你必须(或只是喜欢)操作单词:
$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);