为javascript创建正则表达式

为javascript创建正则表达式,javascript,php,regex,Javascript,Php,Regex,我热衷于使用[^\u0000-\u007F]+和^[A-Za-z0-9.\u-](?:[A-Za-z0-9.\u-]*[A-Za-z0-9.\u-])?$作为一个正则表达式,但它太复杂了,我就是不能让它工作?有没有办法把两者结合起来 我想使用JavaScript版本进行客户端验证,使用Php版本进行服务器端验证。我建议将Unicode表的剩余部分与[\u0080-\uFFFF]一起使用,而不是[^\u0000-\u007F] 在JS中,\w匹配[A-Za-z0-9\,我建议使用 ^[\u0080

我热衷于使用
[^\u0000-\u007F]+
^[A-Za-z0-9.\u-](?:[A-Za-z0-9.\u-]*[A-Za-z0-9.\u-])?$
作为一个正则表达式,但它太复杂了,我就是不能让它工作?有没有办法把两者结合起来


我想使用JavaScript版本进行客户端验证,使用Php版本进行服务器端验证。

我建议将Unicode表的剩余部分与
[\u0080-\uFFFF]
一起使用,而不是
[^\u0000-\u007F]

在JS中,
\w
匹配
[A-Za-z0-9\
,我建议使用

^[\u0080-\uFFFF\w.-](?:[\u0080-\uFFFF\w. -]*[\u0080-\uFFFF\w.-])?$

在PHP中,只需使用:


似乎没有人喜欢PHP中的
\uxxx
@NHAHDH确认在匹配相同的代码点时可能存在问题。

请告诉我们您打算匹配什么,而不仅仅是正则表达式?
[^\u0000-\u007F]+
这是针对非英语字母字符的,例如
的èìòù
,而这
^[A-Za-z0-9.-](?:[A-Za-Za-z0-9.*[A-Za-z0-9.],数字、点、破折号、下划线,开头和结尾没有空格。你的问题很不清楚。提供应匹配和不应匹配的字符串。在本例中,将它们添加到类中,而不是试图找到一个范围,可能是这样:
^[a-zèèèùù0-9.-]+(?:[a-zèèùù0-9.-]+)*$
,带有不区分大小写的标志(但您的问题仍然不清楚)。@Rough:,原因是PHP正则表达式不支持
\uxxx
表示法。然而,这是有原因的。这将与那些字母相匹配。在JS中,这个正则表达式可以按字面表示法使用。您对第一个正则表达式的建议非常糟糕。如果要匹配ASCII范围以外的字符,必须始终使用
u
标志正确解释输入。使用json_解码的解决方案只能正常工作,因为编码到UTF-8的范围是
\xC2\x80-\xEF\xBF\xBF
,其中包含范围
\x80-\xEF
,最多覆盖3字节UTF-8编码序列。我认为您的答案应该编辑为只包含第二个解决方案。在PHP中,如果要按代码点指定字符,请使用
\x{hh…h}
语法。它也适用于字符类,但范围受到模式的限制(在默认模式下,最大代码单元大小-在PHP中为0xFF,在
u
模式下,最大为0x10FFFF)。
\p{L}
是正确的解决方案<在
\u0080-\uFFFF
上的code>json\u decode
是一个没有
u
标志的不安全解决方案-只需使用
\x{hh…h}
符号。请不要尝试在PHP和JS上运行相同的正则表达式。这两种语言在解释正则表达式和字符串表示的方式上存在根本性的差异。您的想法只适用于这种情况-如果端点不同,代码可能会给您带来不必要的惊喜。
$re = '/^[\p{L}0-9_.-](?:[\p{L}0-9_. -]*[\p{L}0-9_.-])?$/u'; 
          ^^^^^           ^^^^^          ^^^^^           ^