允许字母数字和点的正则表达式。

6

你好,我有一个Silex路由中的变量,我们只允许使用字母和数字

->assert('hash','\w+')

我希望变量中也能包含一个点,但我试图编辑这个正则表达式却失败了。非常感谢您的帮助,谢谢!


3
请记住,\w 包括下划线。而且,如果您的正则表达式引擎设置为 Unicode 语义,它的含义会发生变化。 - DavidO
@DavidO,请使用您的提示更新我的答案。我最初是从手机上编写答案的,没有进行详细解释^^; - TheConstructor
3个回答

11

尝试使用字符类[…]),像这样:

[\w.]+

例如:
->assert('hash','[\w.]+')

11

尝试

->assert('hash', '[a-zA-Z0-9.]+')

为什么不使用[\w.]

你把问题标记为PHP,所以我假设这篇手册适用。在那里,它写道:

\w  
    any "word" character

并且

"单词"字符是指任何字母、数字或下划线字符,即任何可以成为Perl "单词"的字符。字母和数字的定义由PCRE的字符表控制,如果正在进行特定于区域设置的匹配,则可能会有所不同。例如,在“fr”(法语)区域设置中,一些大于128的字符代码用于重音字母,并且这些字符可以通过\w进行匹配。

因此,当使用\w时,它可能匹配äöüß...,你不知道。

由于它读取哈希值,您可能还想尝试

->assert('hash', '[a-fA-F0-9.]+')

该程序只接受十六进制数字和.,不接受 G 或 Z 等其他字符。


当文档中声明“...任何可以成为Perl 'word'的字符”时,它实际上应该声明“...任何可以成为Perl标识符的字符”。我们无法控制文档,但我提到这一点是为了提供理由。 - DavidO
@DavidO 嗯,Perl中“单词”听起来很奇怪,但对于标识符,你可能会认为仅匹配英文字母和一些装饰符号如下划线,而不是特定于某个地区的内容。您可以将整个段落表述为:“‘单词’字符是任何字母、数字或下划线字符。如果正在进行特定于语言环境的匹配,则字母和数字的定义可能会有所不同。例如,在“fr”(法语)区域设置中,某些大于128的字符代码用于重音字母,并且这些字符可以通过 \w 进行匹配。” - TheConstructor
1
在Perl中,如果您使用"utf8"编译指示,标识符可以包含任何匹配\w的字符,即使它在>127范围内。 - DavidO
@DavidO 很高兴知道这个,但我想要使用RegExp,只需要知道\w随语言环境而变化,匹配的字符比[a-zA-Z]多,比[^ ]少就可以了;-) - TheConstructor

2

我不知道 assert() 的内部细节,但可以使用 char 类:

->assert('hash','[\w.]+')

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