使用您的样本数据以及一些中文和日文字符,正则表达式
/[!\p{Common}\p{Latin}]*/iu
似乎可以工作。有关更多详细信息,请参阅
预定义Unicode类别这个网站以及一个漂亮的
简单解释在这里。但是,在此版本中,它对非拉丁字符返回一个空匹配。底部的
EDIT:中的那个将为干净的布尔逻辑提供最佳解决方案:
$test_array = array();
$test_array[] = 'JóhnDoe';
$test_array[] = 'Fübar';
$test_array[] = 'Lòrem';
$test_array[] = 'FírstNäme';
$test_array[] = '•••••••';
$test_array[] = 'Çákë';
$test_array[] = '形声字 / 形聲字';
$test_array[] = 'ラドクリフ、マラソン';
header('Content-Type: text/plain; charset=utf-8');
foreach ($test_array as $test_value) {
preg_match('/[!\p{Common}\p{Latin}]*/iu', $test_value, $matches);
$matches = array_filter($matches);
print_r($matches);
}
输出如下所示:请注意中文和日文字符返回空匹配。还请注意,由于 \p{Common} 正则表达式匹配,••••••• 得以传递。如果您不希望像这样的常用字符通过,请将正则表达式更改为
/[!\p{Latin}]*/iu
。我正在使用
array_filter
清除那些空值,但这是笨拙的。因此,这不是完美的,但可以使用:
Array
(
[0] => JóhnDoe
)
Array
(
[0] => Fübar
)
Array
(
[0] => Lòrem
)
Array
(
[0] => FírstNäme
)
Array
(
[0] => •••••••
)
Array
(
[0] => Çákë
)
Array
(
)
Array
(
)
编辑: 这个测试代码使用了我上面发布的正则表达式变体来消除上面提到的空非匹配问题;
/(?:[\p{Latin}])+/iu
。请注意,这是通过仅针对
\p{Latin}
进行匹配来工作的,因此
\p{Common}
在这里不适用。但是,使用
/(?:[\p{Latin}])+/iu
的结果更加清晰,并确保您可以使用简单的布尔检查
preg_match
来检查字符,而无需使用将
$matches
数组与
array_filter
混合的糟糕解决方案。
$test_array = array();
$test_array[] = 'JóhnDoe';
$test_array[] = 'Fübar';
$test_array[] = 'Lòrem';
$test_array[] = 'FírstNäme';
$test_array[] = '•••••••';
$test_array[] = 'Çákë';
$test_array[] = '形声字 / 形聲字';
$test_array[] = 'ラドクリフ、マラソン';
header('Content-Type: text/plain; charset=utf-8');
foreach ($test_array as $test_value) {
preg_match('/(?:[\p{Latin}])+/iu', $test_value, $matches);
print_r($matches);
}
以下是新的结果。请注意,空数组是真正的空的,在这些情况下,prey_match
将返回布尔值false
:
Array
(
[0] => JóhnDoe
)
Array
(
[0] => Fübar
)
Array
(
[0] => Lòrem
)
Array
(
[0] => FírstNäme
)
Array
(
)
Array
(
[0] => Çákë
)
Array
(
)
Array
(
)