PHP正则表达式替换不匹配

时间:2013-11-13 09:30:07

标签: php regex

我正在使用这个正则表达式获取街道地址的门牌号。

[a-zA-ZßäöüÄÖÜ .]*(?=[0-9])

通常,街道就像“Ohmstraße2a”之类的东西。在regexpal.com我的模式匹配,但我猜preg_replace()与它的正则表达式引擎不相同。

$num = preg_replace("/[a-zA-ZßäöüÄÖÜ .]*(?=[0-9])/", "", $num);

更新: 似乎我的模式匹配,但我有一些编码问题与特殊字符如äöü

更新#2: 原来是mysqli的编码问题。

3 个答案:

答案 0 :(得分:3)

首先,如果你想获得门牌号码,那么你不应该替换它。因此,而不是preg_replace使用preg_match

我修改了你的正则表达式以便更好地匹配:

$street = 'Öhmsträße 2a';

if(preg_match('/\s+(\d+[a-z]?)$/i', trim($street), $matches) !== 0) {
    var_dump($matches);
} else {
    echo 'no house number';
}
  1. \s+匹配一个或多个空格字符(空格,制表符等)
  2. ( ... )定义了一个可以在$matches中访问的捕获组
  3. \d+匹配一个或多个数字(2,23,235,...)
  4. [a-z]匹配a到z
  5. 中的一个字符
  6. ?表示它是可选的(不是每个门牌号都有一个字母)
  7. $表示字符串结尾,因此它确保门牌号位于字符串的末尾
  8. 请确保使用trim()删除门牌号结尾后的任何空格。

答案 1 :(得分:1)

u修饰符有时可以帮助处理"额外"字符。

答案 2 :(得分:0)

我觉得这可能是字符集或UTF-8问题。

找出你正在运行的PHP版本是个好主意。如果我没记错的话,5.1.x左右就有完整的Unicode支持