【问题标题】:I can't use my regular expression right我不能正确使用我的正则表达式
【发布时间】:2013-05-21 19:37:40
【问题描述】:

对不起,伙计们,也许我的问题真的很愚蠢,但我卡住了......再次使用正则表达式......

看,我有一个变量,例如:

$str = "[quote]Here I am 2013[/quote]";

$rega = preg_match_all("/[quote](.*)[quote]/i",$str,$hols);

当我尝试获取 $hols 变量时,我得到如下信息:

quote]我在这里 2013[/quote

但我需要这样的东西:

我在这里 2013

第二个问题是当我尝试从 $str 获取时:

$str = "[quote]Hello people

this

is

my...[/quote]";

因此,使用我的正则表达式,我得到如下内容:

quote]Hello people

但我需要:

Hello people

this

is

my...

如果您能向我解释如何处理它,如何使它正确,我将不胜感激。因为我不知道如何解决它。

【问题讨论】:

    标签: php expression preg-match-all


    【解决方案1】:

    除了Frits所说的,还需要转义括号;您当前要求 RegEx 匹配任何字符“q”、“u”、“o”、“t”或“e”,然后是任何字符,然后再次匹配相同的字符;匹配如此之大的唯​​一原因与您的表达贪婪有关,而 Frits 的建议会“破坏”这一点(尽管如此)。简而言之,像这样转义括号:

    /\[quote\](.*?)\[\/quote\]/mis
    

    更多解释:

    考虑到您之前的模式:

    /[quote](.*)[quote]/i
    

    你要求:

    1. 集合中的任何字符 [quote]
    2. 除换行符以外的任何字符,零次或多次
    3. 集合中的任何字符 [quote]

    因此,例如,字符串Queen's Charter! 将匹配,因为Queen's Charteueen's Chart 的内部匹配(因为第一个和最后一个字符类没有被捕获)。

    如果您使第二步不贪心,那么您将得到Queete,根本没有内部匹配。

    编辑:回复评论

    我运行了以下代码:

    preg_match_all(
        '/\[quote\](.*?)\[\/quote\]/mis',
        "[quote]A test!  A Marvelous Test![/quote]",
        $matches
    );
    
    var_dump($matches);
    

    得到以下结果:

    array (size=2)
      0 => 
        array (size=1)
          0 => string '[quote]A test!  A Marvelous Test![/quote]' (length=41)
      1 => 
        array (size=1)
          0 => string 'A test!  A Marvelous Test!' (length=26)
    

    【讨论】:

    • 抱歉,但您的变体不起作用,它仍然返回类似:[quote]Hello people this is my...[/quote] with [quote] I mean
    • 您在查看$hols[0] 还是$hols[1]$hols[0] 将包含 full 匹配项,即整个字符串; $hols[1] 将包含 subpattern(括号中的部分,在引号标记之间)。有关详细信息,请参阅我最近的编辑。
    【解决方案2】:
    preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
                                 ^--- missing / there
    

    另外,你可能想要:

    "/\[quote\](.*?)\[\/quote\]/mis"
    

    要做到这一点:不贪心,匹配多行,你必须转义[],因为[quote]实际上定义了一个只匹配q、u、o、t和e的字符类

    如果您还可以嵌套[quote]s,则必须避免使用正则表达式,因为嵌套不是上下文无关的。正则表达式只能处理上下文无关文法。那么解决方案就是构建一个(非常简单的)解析器。

    【讨论】:

    • +1 用于解析器;永远不要嵌套正则表达式。如果你认为你可以,你就不能。这样一来,疯狂就在其中。
    猜你喜欢
    • 2020-10-29
    • 2012-12-22
    • 1970-01-01
    • 2017-08-10
    • 2023-03-27
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多