我不能正确使用我的正则表达式

时间:2013-05-21 19:37:40

标签: php expression preg-match-all

对不起,伙计们,也许我的问题真的很傻,但是我被困了......再次以正则表达式......

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

$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...

如果你能向我解释如何处理它,如何使它正确,我真的很感激。因为我不知道如何解决它。

2 个答案:

答案 0 :(得分:2)

preg_match_all("/[quote](.*)[quote]/i",$str,$hols);
                             ^--- missing / there

另外,您可能想要:

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

要使它成为:ungreedy,匹配多行,你必须转义[],因为[quote]实际定义了一个匹配q,u,o,t和ë

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

答案 1 :(得分:2)

除了弗里茨所说的,你需要摆脱括号;您目前要求RegEx匹配任何字符'q','u','o','t'或'e',后跟任何内容,然后再重复相同的字符;这场比赛的唯一原因就在于你的表情很贪婪,而Frits的建议会“打破”这个(正确的)。简而言之,像这样逃避括号:

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

更多解释:

考虑您之前的模式:

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

你要求:

  1. 集合中的任何字符[quote]
  2. 除换行符之外的任何字符,零次或多次
  3. 集合中的任何字符[quote]
  4. 因此,例如,字符串Queen's Charter!将与Queen's Charte匹配,内部匹配为ueen'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)