regex 什么是PHP正则表达式检查上传文件名是否有德语变音?

hmae6n7t  于 2023-03-04  发布在  PHP
关注(0)|答案(3)|浏览(94)

什么是PHP正则表达式检查如果上传文件名有德语变音?文件名:截图_埃尔德什.png
我试过下面,但没有工作

if ( preg_match('(?<![äöüÄÖÜß\w])([äöüÄÖÜß\w]+)(?![äöüÄÖÜß\w])', $file_name )){
        $file['error'] = __( "WARNING: Invalid file name. German umlauts are not allowed.", 'wp-file' );
    }
b1zrtrql

b1zrtrql1#

使用UNICODE生成**“a with元音变音(或分音符)"**有两种方法:

    • “现成”* 字符:代码点U+00 E4 ä拉丁文小写字母A带横杠
  • 两个代码点的组合(U+0061 a拉丁小写字母A),后跟U+0308 ̈组合DIAERESIS

所有其他元音**“e i o u”“y”也处于相同的情况:有这两种方法来产生它们。
要处理这种情况,您可以简单地考虑模式中的两种可能性,但也可以使用Normalizer from the intl将字符串转换为NFC。
需要考虑的另一件事是,当您必须处理多字节字符时(在UTF-8中,重音字符就是这种情况),您需要通知regex引擎,否则它将逐个字节读取主题字符串和模式,而不是逐个码点读取。
考虑以下角色类:[ä](带有 “readymade” 小A,带分音符)。ä用UTF-8中的两个字节编码:C3 A4.这意味着默认情况下,如果在主题字符串中找到这两个字节中的一个,那么具有该字符类的模式将成功,但这并不意味着主题字符串包含
ä**:

var_dump(preg_match('~[ä]~', '↤')); // int(1)

此模式成功,因为U+21 A4 从条中向左箭头是用字节E2 86 A4编码的,并且找到了字节A4。
要通知正则表达式引擎字符串(模式和主题)必须逐个码点读取,可以像这样启动模式:

var_dump(preg_match('~(*UTF8)[ä]~', '↤')); // int(0)

或使用u修饰符:

var_dump(preg_match('~[ä]~u', '↤')); // int(0)

总之,匹配分音符的模式可以写成这样:

preg_match('~[äëïöüÿ\N{U+00A8}\N{U+0308}]~ui', $subject)

preg_match('~[äëïöüÿ\N{U+00A8}]|[aeiouy]\N{U+0308}~ui', $subject)

其中\N{U+0308}代表组合分音符,\N{U+00A8}代表单独的分音符。äëïöüÿ是UNICODE块U+0080 -〉U+00 FF Latin-1补充中的 “现成的” 字符。大写字母与i修饰符一起使用。
或者像这样:

preg_match('~(*UTF8)[äëïöüÿ\N{U+00A8}\N{U+0308}]~i', $subject)

或NFC规格化字符串:

preg_match('~[äëïöüÿ\N{U+00A8}]~ui', normalizer_normalize($subject))
eulz3vhy

eulz3vhy2#

你可以试试这个

if (preg_match('/[äöüÄÖÜß]/', $file_name)) {
    $file['error'] = __("WARNING: Invalid file name. German umlauts are not allowed.", 'wp-file');
}
wmvff8tz

wmvff8tz3#

这并不难。请将您的条件更改为:

preg_match('/[\x{E4}\x{F6}\x{FC}\x{C4}\x{D6}\x{DC}\x{DF}]/i', $file_name)

相关问题