我正在尝试找出这两者之间的区别:
preg_match('-^[^'.$inv.']+\.?$-' , $name
preg_match('-['.$inv.']-', $name
谢谢
我正在尝试找出这两者之间的区别:
preg_match('-^[^'.$inv.']+\.?$-' , $name
preg_match('-['.$inv.']-', $name
谢谢
首先,要小心$inv
,根据其内容,可能会在正则表达式中进行一些注入。为避免该问题,请使用preg_quote()
.
也就是说,第一个正则表达式将是:
^ <-- the given string must begin with
[ <-- one of those characters
^ <-- inverse the accepted characters (instead of accepted characters, the following characters will be those that are not accepted)
$inv <-- characters
] <-- end of the list of characters (here not accepted characters)
+ <-- at least one character must be matched, more are accepted
\. <-- a '.'
? <-- the previous '.' isn't mandatory
$ <-- the given string must end here
如果$inv = 'abc.'
匹配:
def
def.
d
d.
它不会匹配:
.
, 因为该组.
不接受[^abc.]
, 即使\.?
后面有, 至少一个字符必须在 a 之前.
de.s
,因为.
在组中不被接受[^abc.]
,所以只能将它放在给定字符串的末尾,这要归功于\.?
a
deb
testc
teskopkl;;[!@#$b.
,因为b
'[^'.$inv.']+'
它可以简化为(尽管'^[^'.$inv.']+$'
不要忘记)preg_quote
第二个将是:
[ <-- one of those characters
$inv <-- characters
] <-- end of the list of characters (here accepted characters)
如果$inv = 'abc.'
匹配
a
, b
,c
或.
它不会匹配任何不包含a
,b
或.c
.
为了便于举例说明,假设$inv = 'a'
……</p>
-^[^a]+\.?$-
由于插入符号和美元符号,需要匹配整个字符串。该字符串应以“a”以外的字符开头,后跟 0 个或多个仍不是“a”的字符。但是,此字符串中的最后一个字符可以是点(因此点后面的问号)-[a]-
将匹配字符串中的第一个“a”,一旦找到匹配项,它就会停止查找,因为您正在使用preg_match()
而不是preg_match_all()
。但是,您的第一个模式没有任何意义,因为已经\.
= [^a]
(翻译成英文为:点已经不是“a”)
[编辑]当字符类中有一个点时,第一个模式实际上可能意味着什么。
第一个模式匹配不包含任何字符$inv
的行,可选地以句点结束该行。
第二个模式匹配任何包含$inv
.
-
是模式分隔符,标记表达式的开始和结束。从技术上讲,它可以是任何字符,但最常见的是/
.^
表示字符串的开头[ ]
封装了一组要匹配的字符[^ ]
封装了一组不应该匹配的字符,任何其他字符都被认为是匹配的。+
表示前一个字符或一组字符应该匹配一次或多次。.
通常匹配任何字符,这就是为什么它在\.
这里被转义以指示文字句点字符。?
表示前一个字符应该匹配零次或一次。$
表示字符串的结尾。用简单的英语来说,第一个是寻找以一个或多个不包含在$inv
字符串中的字符开头并以可选句点结尾的整行。
第二个只是尝试匹配由值指定的一个字符$inv
。
['.$inv.']
让我们从第二个开始,因为它更简单。
$inv
。$inv
.
^[^'.$inv.']+\.?$
现在是第二个:
$inv
(^
内部[]
是否定匹配)。$inv
必须位于字符串的开头(^
外部[]
匹配字符串的开头)。+
后面的符号[]
)\.?
是一个可选的点字符)。$
匹配字符串的结尾)。请注意,在这两种情况下,如果$inv
包含任何正则表达式保留字符,它将失败(或做一些意想不到的事情)。你应该使用preg_quote()
来避免这种情况。
所以……呃,它们是完全不同的表达方式。与其说是“他们之间有什么区别”,不如说是“他们有什么相同之处”。答:不多。
第一个匹配从开始到第一次出现 $inv 的字符串,然后是字符串必须结束的一个或零个句点。
第二个匹配一个只包含 $inv 的字符串。
本质上它们几乎相同,除了第一个允许 . 在末尾。