正则表达式之间的区别

时间:2013-01-10 17:09:27

标签: php regex expression

我正在试图找出这两者之间的差异:

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

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

由于

6 个答案:

答案 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匹配

  • 包含至少一个字母bc.a
  • 的任何字符串

它不匹配任何不包含bc.或{{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的字符串。

基本上它们几乎是相同的,除了第一个允许可能的。最后。