Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#/.NET的核心方法是过滤掉非罗马字符,但允许在所有使用它们的语言中使用罗马字母的所有重音和变音符号_C#_Asp.net Core - Fatal编程技术网

C#/.NET的核心方法是过滤掉非罗马字符,但允许在所有使用它们的语言中使用罗马字母的所有重音和变音符号

C#/.NET的核心方法是过滤掉非罗马字符,但允许在所有使用它们的语言中使用罗马字母的所有重音和变音符号,c#,asp.net-core,C#,Asp.net Core,我正在寻找一种有效的方法来验证网站文本框和文本区域输入元素。输入仅用于人类可读的文本,如姓名、地址、评论、问题、调查答案等。此外,有效输入应仅允许所有种类的罗马/拉丁字符,包括拉丁1、拉丁2、拉丁3和拉丁4字符集中包含的字符(请参阅)。这是因为我们的呼叫中心只能读取罗马字符(没有中文、韩文、日文、泰文、俄文、阿拉伯文、希伯来文、希腊文等),因为至少当语言不是英语时,他们可以使用谷歌翻译,或者当文本输入用于地址时,地址标签或发票上仍然有意义 由于是web输入,通过HTTP传输的UTF-8字符由C#

我正在寻找一种有效的方法来验证网站文本框和文本区域输入元素。输入仅用于人类可读的文本,如姓名、地址、评论、问题、调查答案等。此外,有效输入应仅允许所有种类的罗马/拉丁字符,包括拉丁1、拉丁2、拉丁3和拉丁4字符集中包含的字符(请参阅)。这是因为我们的呼叫中心只能读取罗马字符(没有中文、韩文、日文、泰文、俄文、阿拉伯文、希伯来文、希腊文等),因为至少当语言不是英语时,他们可以使用谷歌翻译,或者当文本输入用于地址时,地址标签或发票上仍然有意义

由于是web输入,通过HTTP传输的UTF-8字符由C#系统在内部转换为Unicode(UTF-16)。我想要一个返回布尔值的函数,该函数可以说明字符串中是否有非罗马/拉丁字符,但它不应该太严格,不允许使用不常见的重音罗马字母,例如法语字母、德语字母ẞ, 爱尔兰人Ṡ, 芬兰语、丹麦语等(所有这些都不是拉丁语,更不用说ASCII)。当然,所有的标点符号都应该触发一个错误;这应该解决HTML/JS/SQL注入问题。第二个验证器(不是这个问题的一部分)将过滤允许的标点符号,如连字符、句号、撇号等

我在寻找想法,不一定是代码。我有一种感觉,有一个NuGet软件包,或者一个已经制作好的函数,它使用了.NET工具,比如和

这个问题的价值来自其他需要相同验证的开发人员。欢迎部分回答,我将发布这个问题的最终解决方案,供大家使用。(让我们看看这个问题编辑是否可以弥补这个问题目前的-2票:-)

编辑:

回应下面的负面评论,我意识到“非罗马”对于喜欢精确性的电脑极客来说有点模糊。但我们正处在一个云时代,所有说各种语言的人都在把东西输入网页。我想将输入限制为所有种类的罗马/拉丁字符。我所说的“罗马”是指从a,b,c,d,e,…x,y,z衍生出来的任何东西。很有常识,你不觉得吗?所以我想允许使用类似于法语、德语、丹麦语、挪威语、保加利亚语等语言使用者使用的字母的字符,但不包括汉语、韩语、日语、泰语、俄语、阿拉伯语、希伯来语、希腊语字符。它们没有错,但这只是一个业务策略,所以数据库中的字符至少是可读和可排序的


所以我不想在这里寻找任何超精确的东西,一个基本的指导原则是它需要包括拉丁1、拉丁2、拉丁3和拉丁4字符集中定义的所有字母,但我需要过滤器将它们检测为unicode(因此有unicode字符的数值,而不是拉丁3字符集)。我认为标准足够具体。

您可以尝试使用正则表达式,它支持

你的正则表达式可能看起来像

(\s|\p{IsBasicLatin}\p{iscompbiningdiacriticalmarks})+

你也可以有一个更广泛的范围与排除。例如:

[\u0000-\u036F-[\p{p}\p{IsIPAExtensions}]


当然,您需要测试和调整确切的正则表达式,以允许/不允许标点符号和其他字符类。

在回顾了Sten、Scott Hannen和Prix的提示后,我决定采用以下方法:

private static string allowedcharacterregexpatern=@“^([a-zA-Z0-9\(\)\+,\-\./@35;和][u124;[\ u00C0-\u024F].[\u1E00-\u1EFF])+$”;
公共静态bool允许的字符(字符串s)
{
//决定:字符包括:
//基本拉丁语:0x0030-0039、0x0041-0x005A、0x0061-0x007A:0-9、A-Z、A-Z:(https://unicode.org/charts/PDF/U0000.pdf)
//拉丁语1:0x00C0-0x00FF(https://unicode.org/charts/PDF/U0080.pdf)
//拉丁文扩展A:0x0100-0x017F(https://unicode.org/charts/PDF/U0100.pdf)
//拉丁文扩展-B:0x0180-0x24F(https://unicode.org/charts/PDF/U0180.pdf)
//拉丁文扩展附加:0x1E00-0x1EFF(https://unicode.org/charts/PDF/U1E00.pdf)
//一些标点符号:()+,-./@#&
返回Regex.IsMatch(s,AllowedCharacterRegExpatern);
}

请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。正如目前所写的,很难准确地说出你在问什么。请参阅页面以获取澄清此问题的帮助。还包括您尝试过的内容以及与问题相关的任何代码。非罗马字符有什么问题?如果您解释一下,而不仅仅是您决定使用什么解决方案,这将非常有帮助。也许您正在寻找的是
char.isliter()
char.IsDigit()
Isleter
对于它所接受的内容是相当宽泛的。@DourHighArch非罗马人没有错。我编辑这个问题是为了澄清目的和标准。我不想听起来很滑稽,但只要问这个问题就会让我微笑。一旦标点符号和其他非字母符号被消除,希伯来语和阿拉伯语怎么可能是恶意的?恶意的阿拉伯字符注入看起来像什么?感谢您的帮助。我接受了你的回答,并按照下面另一个回答中的承诺提供了我的解决方案。