Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从一个字符串中划分streetnr和street?_Php - Fatal编程技术网

Php 如何从一个字符串中划分streetnr和street?

Php 如何从一个字符串中划分streetnr和street?,php,Php,我想把一个字符串分为var street和streetnr。如何使用php实现这一点 数据如下所示: Bakerstreet 5 Wild Street 5 a Best Street 5a Simplestreet 我有没有数字的街道和字母的街道。。。我该怎么做 所以街道应该永远是这样的 var street=贝克街、野生街、最佳街、Simplestreet var streetnr应始终为=5,5 a,5 a 我的想法是在每一个空白的“。。。然后反转数组,看第一个元素是否只是一个字母。如果

我想把一个字符串分为var street和streetnr。如何使用php实现这一点

数据如下所示:

Bakerstreet 5
Wild Street 5 a
Best Street 5a
Simplestreet
我有没有数字的街道和字母的街道。。。我该怎么做

所以街道应该永远是这样的

var street=贝克街、野生街、最佳街、Simplestreet

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


我的想法是在每一个空白的“。。。然后反转数组,看第一个元素是否只是一个字母。如果是,我就把它放在街上。然后我检查下一个元素。如果只有数字,我把它放在streetnr。。。依此类推,您可以使用以下正则表达式进行匹配:

preg_match('/^(.+?)(?:\s+(\d.*))?$/', $street, $matches);
$street = $matches[1];
if (count($matches) == 3)
  $streetnr = $matches[2];

使用正则表达式

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

如果街道的格式正确,$match是一个数组,包含[1]=街道名称,[2]=街道编号,则preg_match返回true。

我将此用作PHP培训的练习。虽然我是regex的超级粉丝,但我想在没有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>";

 ?>

因此,在找到解决方案之前,您确实需要定义如何确定“街道”部分与“街道编号”的标准。你能用现实世界的术语来解释需求吗?好的,我编辑了这个问题,sry就是为了这个@Susanne92你编辑了这个问题,但是你仍然没有评论你打算用什么样的逻辑来分割这些部分。我希望你能看到评论的方向。在您看来,这似乎是一个简单的问题,但它可能非常复杂,这取决于数据的可变性以及您试图在代码中再现的实际人类逻辑。我的建议是真正花些时间思考这些方面,这样你就可以尝试缩小问题的范围。在这些情况下会发生什么
1st Street 10b
Route 66 12a
以下是一些毫无疑问的PHP培训建议:对于不是简单循环计数器的所有内容,使用有意义的变量名。即使在那里,如果柜台有一个特殊的意义。否则,同事们会恨你,你将无法理解自己的代码,地狱之门将打开@STTLCU:你会得到| st=1st Street | no=10b |(我不得不在那里修复一个bug,谢谢!)和| st=66号公路| no=12a |很高兴能帮上忙:)@MartinThurau:哦,打开地狱之门肯定是我不愿意被指责的事情-我会尝试使用更有意义的名字,nxt time:)