我正在试图找出这两者之间的差异:
preg_match('-^[^'.$inv.']+\.?$-' , $name
preg_match('-['.$inv.']-', $name
由于
答案 0 :(得分:2)
首先,要小心$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.]
,即使稍后有\.?
,至少有一个字符必须在.
之前1}} 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
,.
或{{1}}的字符串。
答案 1 :(得分:2)
为了更容易举例说明,假设$inv = 'a'
...
-^[^a]+\.?$-
需要匹配整个字符串。字符串应该以“a”以外的字符开头,后跟0个或更多仍然不是“a”的字符。但是,此字符串中的最后一个字符可以是点(因此点后面的问号)-[a]-
将匹配字符串中的第一个“a”,并且一旦找到匹配项就会停止查看,因为您使用的是preg_match()
而不是preg_match_all()
。你的第一个模式没有任何意义,因为已经\.
= [^a]
(翻译成英文为:点已经不是“a”)
[编辑] 当字符类中有一个点时,第一个模式实际上可能意味着什么。
答案 2 :(得分:0)
第一个模式匹配$inv
中不包含任何字符的行,可选择以句点结束该行。
第二种模式匹配包含$inv
中任何字符的任何内容。
-
是模式分隔符,标记表达式的开头和结尾。它在技术上可以是任何字符,但通常是/
。^
表示字符串的开头[ ]
封装了一组要匹配的字符[^ ]
封装了一组不匹配的字符,任何其他字符都被视为匹配。+
表示前一个字符或一组字符应匹配一次或多次。.
通常匹配任何字符,这就是为什么它在此处作为\.
进行转义以表示文字句点字符。?
表示前一个字符应匹配零次或一次。$
表示字符串的结尾。答案 3 :(得分:0)
简单来说,第一个是查找整行,该行以$inv
字符串中未包含的一个或多个字符开头,并以可选句点结束。
第二个只是尝试匹配$inv
的值指定的一个字符。
答案 4 :(得分:0)
['.$inv.']
让我们先从第二个开始,因为它更简单。
$inv
中字符串中包含的任何一个字符。$inv
中该字符之前或之后的任何其他内容。
^[^'.$inv.']+\.?$
现在是第二个:
$inv
中的字符(^
内的[]
是否定匹配)。$inv
的匹配必须位于字符串的开头(^
之外的[]
与字符串的开头匹配)。+
之后的[]
符号\.?
是一个可选的点字符。)$
匹配字符串的结尾)。请注意,在这两种情况下,如果$inv
包含任何正则表达式保留字符,它将失败(或执行某些意外操作)。您应该使用preg_quote()
来避免这种情况。
所以......呃,他们的表情完全不同。与其说“他们之间有什么区别”并不是“他们有什么相同”。答:不多。
答案 5 :(得分:-1)
第一个匹配从开始到$ inv的第一次出现的字符串,后跟字符串必须结束的一个或零个句点。
第二个匹配仅包含$ inv的字符串。
基本上它们几乎是相同的,除了第一个允许可能的。最后。