正则表达式删除除数字和一个字符之外的所有内容

时间:2015-05-16 22:54:15

标签: php regex

我需要删除除数字之外的所有内容,如果字符串中存在一个字符。它是我需要提取房屋号码的街道名称。字符串后面可能还有一些内容,但不是必要的。

原始字符串类似于

Wagnerstrasse 3a platz53,eingang 3,Zi.3005 

我用这样的数字提取街道:

preg_match('/^([^\d]*[^\d\s]) *(\d.*)$/', $address, $match);

然后,我在" Wagnerstrasse 3a"

上做了if声明
if (preg_replace("/[^0-9]/","",$match[2]) == $match[2])

我需要更改正则表达式以便获得一个跟随字母,即使它们之间有空格,但只有当它是单个字母时才能使我的if适用于这种情况/更好的正则表达式只是除去以下所有内容:

Wagnerstrasse 3a       <-- expected result: 3a
Wagnerstrasse 3 a      <--- expected result 3 a 
Wagnerstrasse 3        <--- expected result 3
Wagnerstrasse 3 a bac  <--- expected result 3 a

3 个答案:

答案 0 :(得分:3)

您可以尝试使用单词边界的类似内容:

array(6) {
  [0]=>
  int(4)
  [1]=>
  int(6)
  [2]=>
  int(7)
  [3]=>
  int(8)
  [4]=>
  int(9)
  [5]=>
  int(10)
}

该字母位于可选组中,之前有可选空格。即使没有字母,最后一个字边界也会与数字匹配,后面是什么(空格,逗号,字符串的结尾......)。

注意:要避免使用街道名称中的数字,您可以尝试将模式锚定在前瞻中的第一个逗号,例如:

preg_match('~\b\d+(?: ?[a-z])?\b~', $txt, $m)

我允许你用你的案例改进这个子模式。

答案 1 :(得分:1)

<?php
$s1 = 'Wagnerstrasse 3 platz53,eingang 3,Zi.3005';
$s2 = 'Wagnerstrasse 3a platz53,eingang 3,Zi.3005';
$s3 = 'Wagnerstrasse 3A platz53,eingang 3,Zi.3005';
$s4 = 'Wagnerstrasse 3 a platz53,eingang 3,Zi.3005';
$s5 = 'Wagnerstrasse 3 A platz53,eingang 3,Zi.3005';

//test all $s
preg_match('#^(.+? [0-9]* *[A-z]?)[^A-z]#', $s1, $m);

//if you want only the street number
//preg_match('#^.+? ([0-9]* *[A-z]?)[^A-z]#', $s1, $m);

echo $m[1];
?>

答案 2 :(得分:0)

在对该主题进行了一些研究和数小时检查地址(这么多地址)之后,我找到了一个解决方案,直到现在,并没有失败。可能是我没有意识到,但似乎相当不错。这是一个以前没有见过的正则表达式...如果行中没有数字,则正则表达式失败。所以我做了一些黑客攻击(提到数百万的nines ......)

基本上,正则表达式非常适合在最后查找数字并在文本中间保留数字但是对于上面提到的事实并且如果街道以数字开头则失败。所以我做了另一个小黑客并将第一个数字爆炸到后面并将其作为数字捕获。

if ($this->startsWithNumber($data))
{
    $tmp = explode(' ', $data);
    $data = trim(str_replace($tmp[0], '', $data)) . ' ' . $tmp[0];
}
if (!preg_match('/[0-9]/',$data)) 
{
    $data .= ' 99999999999999999999999999999999999999999999999999999999999999999999999';
}
$data = preg_replace("/[^ \w]+/",'',$data);

                    $pcre = '/\A\s*
(.*?) # street
\s*
\x2f? # slash
(
    \pN+\s*[a-zA-Z]? # number + letter
    (?:\s*[-\x2f\pP]\s*\pN+\s*[a-zA-Z]?)* # cut
) # number
\s*\z/ux';
                    preg_match($regex, $data, $h);

$compare = strpos($h[2],'999999999999999999999999999999999999999999999999999999999999999999999999');
                    if ($compare !== false) {
                        $h[2] = null;
                    }
                    $this->receiverStreet[] = (isset($h[1])) ? $h[1] : null;
                    $this->receiverHouseNo[] = (isset($h[2])) ? $h[2]  : null;
public function startsWithNumber($str)
    {
        return preg_match('/^\d/', $str) === 1;
    }