0

我正在尝试找出这两者之间的区别:

preg_match('-^[^'.$inv.']+\.?$-' , $name

preg_match('-['.$inv.']-', $name

谢谢

4

6 回答 6

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.], 即使\.?后面有, 至少一个字符必须在 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.

于 2013-01-10T17:18:24.587 回答
2

为了便于举例说明,假设$inv = 'a'……</p>

  • -^[^a]+\.?$-由于插入符号和美元符号,需要匹配整个字符串。该字符串应以“a”以外的字符开头,后跟 0 个或多个仍不是“a”的字符。但是,此字符串中的最后一个字符可以是点(因此点后面的问号)
  • -[a]-将匹配字符串中的第一个“a”,一旦找到匹配项,它就会停止查找,因为您正在使用preg_match()而不是preg_match_all()

但是,您的第一个模式没有任何意义,因为已经\.= [^a](翻译成英文为:点已经不是“a”)

[编辑]当字符类中有一个点时,第一个模式实际上可能意味着什么。

于 2013-01-10T17:29:09.493 回答
0

第一个模式匹配不包含任何字符$inv的行,可选地以句点结束该行。

第二个模式匹配任何包含$inv.

  • -是模式分隔符,标记表达式的开始和结束。从技术上讲,它可以是任何字符,但最常见的是/.
  • ^表示字符串的开头
  • [ ]封装了一组要匹配的字符
  • [^ ]封装了一组应该匹配的字符,任何其他字符都被认为是匹配的。
  • +表示前一个字符或一组字符应该匹配一次或多次。
  • .通常匹配任何字符,这就是为什么它在\.这里被转义以指示文字句点字符。
  • ?表示前一个字符应该匹配零次或一次。
  • $表示字符串的结尾。
于 2013-01-10T17:15:11.277 回答
0

用简单的英语来说,第一个是寻找以一个或多个不包含在$inv字符串中的字符开头并以可选句点结尾的整行。

第二个只是尝试匹配由值指定的一个字符$inv

于 2013-01-10T17:16:55.540 回答
0
['.$inv.']

让我们从第二个开始,因为它更简单。

  • 这只是匹配一个字符串,该字符串包含变量中字符串中包含的任何单个字符$inv
  • 它可以包含来自$inv.

 

^[^'.$inv.']+\.?$

现在是第二个:

  • 这匹配一个包含in 字符之外的任何内容的字符串$inv^内部[]是否定匹配)。
  • 不属于其中的匹配项$inv必须位于字符串的开头(^外部[]匹配字符串的开头)。
  • 字符串可以包含任意数量的匹配字符(一个或多个;这是+后面的符号[]
  • 之后,它可能有一个可选的点(这\.?是一个可选的点字符)。
  • 之后就没有别的了($匹配字符串的结尾)。

请注意,在这两种情况下,如果$inv包含任何正则表达式保留字符,它将失败(或做一些意想不到的事情)。你应该使用preg_quote()来避免这种情况。

所以……呃,它们是完全不同的表达方式。与其说是“他们之间有什么区别”,不如说是“他们有什么相同之处”。答:不多。

于 2013-01-10T17:22:16.960 回答
-1

第一个匹配从开始到第一次出现 $inv 的字符串,然后是字符串必须结束的一个或零个句点。

第二个匹配一个只包含 $inv 的字符串。

本质上它们几乎相同,除了第一个允许 . 在末尾。

于 2013-01-10T17:13:32.830 回答