我正在尝试找出这两者之间的区别:
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.'匹配:
defdef.dd.它不会匹配:
., 因为该组.不接受[^abc.], 即使\.?后面有, 至少一个字符必须在 a 之前.de.s,因为.在组中不被接受[^abc.],所以只能将它放在给定字符串的末尾,这要归功于\.?adebtestcteskopkl;;[!@#$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 的字符串。
本质上它们几乎相同,除了第一个允许 . 在末尾。