使用 php preg_match 从论坛引用中获取 id

Using php preg_match to get an id from forum quotes

我一直在使用 preg_match 尝试从我写的论坛中的引用中获取 ID。这是我目前所拥有的。

$quote = '[quote]19[\quote] This is a reply to the quote.';

$get = '/([quote])([0-9])([\quote])/';

$id = '';

preg_match($get, $quote, $id);

echo $id[0];

不幸的是,这并没有给我我希望的结果,我尝试了很多变体,甚至尝试了 preg_replace,希望能给我我需要的东西,但是在大量阅读堆栈溢出之后我认为 preg_match 是要走的路。我似乎无法得到我想要的,即引号标签之间的 id。

我在 preg 方面的经验充其量是有限的,我已尽最大努力使其正常工作,但不幸的是,这超出了我目前的知识范围,因此我们将不胜感激。

提示

  • [] 用作字符 class 分隔符。
    它们必须转义 \[ , \] 什么时候按字面意思理解。
    定义 [0-9] 的意思就是:数字的字符 class。
  • (…) 括号包含结果组。
    如果您只想提取 [quote] 和 [\quote] 之间的数字数据 ([0 -9]*?) 应该放在方括号中。结果将在 $id[1] (group # 1).
  • [\quote] 中的 反斜杠“\” 字符也必须转义,因为它本身就是转义字符:[\\\\quote](4 次 \ ,因为它被解释了两次;不知何故有点棘手,我知道)。
    顺便说一句:也许 [/quote] 是这个意思;这样会更容易 (?)

代码

<?php
    $quote1 = '[quote]19[\quote] This is a reply to the quote.';
    $quote2 = '[quote]19[/quote] This is a reply to the quote.';
    // $get = '/\[quote\]([0-9].*?)\[\quote\]/';
    $get1 = '%\[quote\]([0-9]*?)\[\\quote\]%';
    $get2 = '%\[quote\]([0-9]*?)\[/quote\]%';
    $id = '';
    preg_match($get1, $quote1, $id);
    echo '$get1,$quote1 :: ' . $id[1] . '<br />';
    preg_match($get2, $quote2, $id);
    echo '$get2,$quote2 :: ' . $id[1] . '<br />';
?>

输出:
$get1,$quote1::19
$get2,$quote2::19

正则表达式评论

    \[          # Match the character “[” literally
    quote       # Match the characters “quote” literally
    \]          # Match the character “]” literally
    (           # Match the regular expression below and capture its match into backreference number 1
       [0-9]       # Match a single character in the range between “0” and “9”
          *?          # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
    )
    \[          # Match the character “[” literally
        \\       # Match the character “\” literally
    quote       # Match the characters “quote” literally
    \]          # Match the character “]” literally