正则表达式删除瑞典字符。它不应该

时间:2014-11-13 14:56:36

标签: php regex preg-replace

我有这个公式来检查名称是否正确并删除非字母。但是,如果我的名字在名称中有å,å或ö,它将删除该字母,因为它不是英文字母的一部分

<?php
//mb_internal_encoding('UTF-8');
function ValidName($namn = NULL, $efternamn = NULL){
if(isset($namn)) {
$namn = preg_replace('/[^A-Za-z]/', '',  $namn);
return $namn;
}
if(isset($efternamn)) {
$efternamn = preg_replace('/\P{L}+/', '',  $efternamn);
return $efternamn;
}

}
?>

我尝试在/后添加u以允许unicode字母,但之后它只是偷了整个名字。 我在文件中也有这一行:mb_internal_encoding('UTF-8');

那么我如何正确地保持名称,但丢失点,逗号,数字以及你无法命名的所有内容?

专名:hellström

使用我的公式后:hellstrm

感谢任何帮助

2 个答案:

答案 0 :(得分:3)

您可以使用unicode属性\P{L}来检测所有unicode非字母:

$efternamn = preg_replace('/\P{L}+/', '',  $efternamn);

答案 1 :(得分:0)

在您继续之前,强制性文章Falsehoods Programmers Believe About Names。允许用户为其名称添加任何内容是最好的(除非它是一个系统,其中必须使用用户的真实姓名,并且该名称后来与规范化数据库匹配)。


回到问题,有两种方法可以将öö(U + 00F6)表示为单个代码点,或将表示为两个代码点(o并结合分析U + 0308)

如果您想允许使用任何语言的字母,则必须允许Letter and Mark categories中的所有字符:

$efternamn = preg_replace('/[^\p{L}\p{M}]+/', '',  $efternamn);

这种方法非常粗糙,因为它没有检查组合标记是否放置正确。

如果上面的正则表达式不起作用,请尝试将u modifier添加到上面的正则表达式。