0

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

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

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

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

4

2 回答 2

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

此外,您可能想要:

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

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

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

于 2013-05-21T19:39:18.373 回答
2

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

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

更多解释:

考虑到您之前的模式:

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

您要求:

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

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

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

编辑:回复评论

我运行了以下代码:

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)
于 2013-05-21T19:45:03.283 回答