越南语字符的正则表达式

10

我有一个字符串,想要移除下列情况之外的任何字符:

  • 不包含以下内容:ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂ ưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ

  • 不包含以下内容:[a-z 0-9 A-Z]

  • 不包含以下字符:_ 和空格。

请问有人能帮我写一下此 PHP 正则表达式吗?


你不应该使用正则表达式来解决这个问题。应该使用 Unicode 模块来验证本地化字符集中的字符。 - Ether
7个回答

12

尝试使用这个正则表达式:

/[^a-z0-9A-Z_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễếệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ]/u

u 修饰符 使 PHP 把模式字符串解读为 UTF-8。

如果这样不起作用,请尝试使用 Unicode 字符属性,例如 \p{L} 表示字母,或者使用 转义序列 \x{1234} 来描述单个 Unicode 字符或自定义字符范围:

/[^a-z0-9A-Z_\x{00C0}-\x{00FF}\x{1EA0}-\x{1EFF}]/u

10
上述正则表达式缺少ế,同时重复了ă
以下是正确的越南文字符列表: àáãạảăắằẳẵặâấầẩẫậèéẹẻẽêềếểễệđìíĩỉịòóõọỏôốồổỗộơớờởỡợùúũụủưứừửữựỳỵỷỹýÀÁÃẠẢĂẮẰẲẴẶÂẤẦẨẪẬÈÉẸẺẼÊỀẾỂỄỆĐÌÍĨỈỊÒÓÕỌỎÔỐỒỔỖỘƠỚỜỞỠỢÙÚŨỤỦƯỨỪỬỮỰỲỴỶỸÝ
此外,请记得在使用正则表达式测试之前以NFC形式规范化字符串(string.normalize('NFC'))。 在此处阅读更多信息。

很好的发现,并且关于规范化的提及也很好。初始答案中的正则表达式已更新以包括这些字符。 - Kevin Danikowski

4
请注意,越南语Unicode字符可能会“分解”为具有一个代码点的基本字符和一个或多个代码点的附加变音符号 "combining characters",也可能会被“预组合”成单个Unicode代码点。由于无论它们与哪个基本字符结合,组合变音符号都无法按预期工作,因此在正则表达式范围 [] 中匹配它们时,您将始终匹配它们。
早期版本的Unicode不包含完整的越南语预组合字符集,因此可能会在实际应用中找到带有组合字符的越南语。您可以使用Unicode normalization形式C,NFC将组合字符转换为预组合字符。

1
$newtext = preg_replace('/[^a-z0-9A-Z_[:space:]ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂ ưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ]/u','',$text);

[:space:]是一个匹配空格字符的字符类:http://uk.php.net/manual/en/regexp.reference.character-classes.php - Piskvor left the building
2
你的正则表达式缺少 'ế'。 - Xuân-Lợi Vũ

0

您可以尝试使用以下正则表达式来通过“ê,ế,Ê,Ế”: ^[a-zA-Z_ÀÁÂÃÈÉÊẾÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêếìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ\ ]+$


这是最正确的答案,它不会出现错误“ê,ế,Ê,Ế,...”。符合越南标准。 - Trung Phạm

0

使用Js可以添加这个

const regex = /^[^\u00C0-\u1EF9]+$/i;

regex.test("Việt") -> false

0

您的回答不太清晰,请编辑并添加更多细节,以帮助其他人了解它是如何解决问题的。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接