我正在使用这个正则表达式获取街道地址的门牌号。
[a-zA-ZßäöüÄÖÜ .]*(?=[0-9])
通常,街道就像“Ohmstraße2a”之类的东西。在regexpal.com我的模式匹配,但我猜preg_replace()与它的正则表达式引擎不相同。
$num = preg_replace("/[a-zA-ZßäöüÄÖÜ .]*(?=[0-9])/", "", $num);
更新: 似乎我的模式匹配,但我有一些编码问题与特殊字符如äöü
更新#2: 原来是mysqli的编码问题。
答案 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';
}
\s+
匹配一个或多个空格字符(空格,制表符等)(
... )
定义了一个可以在$matches
中访问的捕获组\d+
匹配一个或多个数字(2,23,235,...)[a-z]
匹配a到z ?
表示它是可选的(不是每个门牌号都有一个字母)$
表示字符串结尾,因此它确保门牌号位于字符串的末尾请确保使用trim()
删除门牌号结尾后的任何空格。
答案 1 :(得分:1)
u修饰符有时可以帮助处理"额外"字符。
答案 2 :(得分:0)
我觉得这可能是字符集或UTF-8问题。
找出你正在运行的PHP版本是个好主意。如果我没记错的话,5.1.x左右就有完整的Unicode支持