如何在多次出现的标签之间抓取文本?

时间:2016-11-26 12:42:41

标签: php regex

我有这个描述,用户提到标签。

[MENTION = 1]一个[/ MENTION] [MENTION = 4]两个[/ MENTION] [MENTION = 748]三个[/ MENTION] HI,这是我!!

我需要知道谁是本说明书中提到的成员,所以我希望。

['one','two','three']

这是我尝试过的:

preg_match_all('/[MENTION=[1-9]](.*?)[\/MENTION]/s', $html, $matches);
if($matches) print_r($matches[1]);

输出:

[
  [0] => one[
  [1] =>  [
  [2] => two[
  [3] =>  [
  [4] => three[
  [5] =>  H
]

如果我需要获得1,4,748的数字怎么办?

2 个答案:

答案 0 :(得分:3)

方括号是RegEx中的保留字符。你需要逃脱它们。这样的事情应该有效:

preg_match_all('/\[MENTION=([1-9]+)\](.*?)\[\/MENTION\]/s', $html, $matches);

我还在ID ([1-9]+)周围添加了一个捕获组,因此您可以获得匹配项中的数值和文字内容($matches[1]将包含数字和$matches[2]将包含文本内容。)

答案 1 :(得分:2)

(\d+)抓取一个或多个号码的小组

(\w+)捕获一个或多个单词字符组

正如您从[1-9]所知,方括号[]是正则表达式中表示字符集的特殊字符。所以,如果你真的想要匹配其中一个,那么你将不得不用反斜杠\[\]

来逃避它们
<?php

$html = '[MENTION=1]one[/MENTION][MENTION=4]two[/MENTION][MENTION=748]three[/MENTION] HI, it is me!!';

preg_match_all('/\[MENTION=(\d+)\](\w+)\[\/MENTION\]/s', $html, $matches);

print_r($matches);
Array
(
    [0] => Array
        (
            [0] => [MENTION=1]one[/MENTION]
            [1] => [MENTION=4]two[/MENTION]
            [2] => [MENTION=748]three[/MENTION]
        )

    [1] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 748
        )

    [2] => Array
        (
            [0] => one
            [1] => two
            [2] => three
        )

)