1

我想将一个字符串分成 var street 和 streetnr。我怎么能用php做到这一点?

数据如下:

Bakerstreet 5
Wild Street 5 a
Best Street 5a
Simplestreet

我有没有数字的街道和有字母的街道......我该怎么做?

所以街道应该永远像

var street = Bakerstreet、Wild Street、Best Street、Simplestreet

var streetnr 应始终为 = 5, 5 a, 5a

我的想法是在每个空白“”之后爆炸字符串......然后我反转数组并查看第一个元素是否只是一个字母。如果是,我把它放到streetnr中。然后我检查下一个元素。如果只有数字,我将其放入 streetnr ...等等

4

3 回答 3

2

我已将此用作我的 PHP 培训的练习。虽然我是正则表达式的忠实粉丝,但我想在没有 em 的情况下做到这一点,并提出以下建议:

<?php
$addr = array("Bakerstreet 5",
"Wild Street 5 a",
"Best Street 5a",
"Simplestreet",
"Won't Work 47a Suite 18b",
"1st Street 10b ",
"Route 66 12a " 
);


echo "<h1>Address-Parsing</h1><ol>";
foreach ($addr as $ad) 
{
  $no=""; // Number
  $st=""; // Street
  $GotNo = false;
  $r = strrev(trim($ad));
  echo "<li>ad=$ad";
  do {
    while ($r{0}=="0") {// special handling for leading "0"s (in reverted string) which are ignored by sscanf...
        if (!$GotNo) $no = "0" . $no;
        else $st = "0" . $st;
        $r = substr($r,1);
    }
    $d = sscanf($r,"%d"); // get number
    $s = sscanf($r,"%c"); // get string
    if (is_null($d[0]) && !$GotNo) {
      // no matching number and have not matched no yet - so this must be string following the nr
      $no = strrev($s[0]) . $no;
      $r = substr($r,strlen($s[0])); // remove match
    } elseif (!$GotNo) {
      $no = strrev($d[0]) . $no;
      $GotNo = true;
      $r = substr($r,strlen($d[0])); // remove match
    } else {// we already have a number, so any text must be streetname
      $st = strrev($r) . $st;
      $r="";
    }
    if ($r !== trim($r)) {$st = " " . $st; $r = trim($r);}
  } while (0<strlen($r));
  $st = trim( $st);
  if (empty($st)) {// might happen when no number was found...
    $st=$no;
    $no="";
  }
  echo "|st=$st|no=$no|</li>";
}
echo "</ol>";

 ?>
于 2013-07-17T07:11:40.363 回答
1

使用正则表达式

preg_match('~^\s*(.*)\s+([0-9]+\s*[a-zA-Z]{0,1})\s*$~', $street, $match);

如果街道格式正确且 $match 是包含 [1]=street name, [2]=streetnr 的数组,则 preg_match 返回 true。

于 2013-07-15T17:15:44.733 回答
0

您可以使用以下正则表达式进行匹配:

preg_match('/^(.+?)(?:\s+(\d.*))?$/', $street, $matches);
$street = $matches[1];
if (count($matches) == 3)
  $streetnr = $matches[2];
于 2013-07-15T17:13:54.100 回答