【问题标题】:Using a regular expression to extract text in between BBCode-style tags使用正则表达式提取 BBCode 样式标签之间的文本
【发布时间】:2012-02-17 15:32:59
【问题描述】:

我有这样的文字

[CONTENT][SECTION]这是C#1部分[/SECTION][SECTION]这是C#2部分[/SECTION][SECTION]这是E#3部分[/SECTION]

我尝试匹配每个部分,包括带有该表达式的部分标签:

\[SECTION\][^SECTION]+(SECTION\])

但上面的代码不起作用,因为 [^SECTION] 在开始和结束标记之间的文本中查找任何不是 S、E、C、T、I、O 和 N 的字符

关于如何解决这个问题的任何想法?

我正在使用 PHP 来匹配标签,它的内容与 preg_match_all();而且我喜欢逐个匹配每个部分,而不是一次匹配所有部分。

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:
    \[SECTION\](.*?)\[/SECTION\]
    

    我认为这就是您想要的,获取单个 SECTION 内容的文本?

    ? 使 * 变得懒惰,因此它只会匹配当前的第一个 [/SECTION]


    例子:

    $input = "[CONTENT][SECTION]This is the section C #1[/SECTION][SECTION]This is the section C #2[/SECTION][SECTION]This is the section E #3[/SECTION]";
    var_dump(preg_match_all("(\[SECTION\](.*?)\[/SECTION\])",$input,$m),$m);
    

    结果:

    int(3)
    array(2) {
        [0]=>array(3) {
            [0]=>string(43) "[SECTION]This is the section C #1[/SECTION]"
            [1]=>string(43) "[SECTION]This is the section C #2[/SECTION]"
            [2]=>string(43) "[SECTION]This is the section E #3[/SECTION]"
        }
        [1]=>array(3) {
            [0]=> string(24) "This is the section C #1"
            [1]=> string(24) "This is the section C #2"
            [2]=> string(24) "This is the section E #3"
        }
    } 
    

    【讨论】:

    • 这不是我需要的,因为我需要单独匹配每个部分。你给我的唯一一个匹配所有部分。
    • 这个正则表达式应该匹配每个部分,一次一个。有关示例代码和结果,请参阅我的编辑。
    【解决方案2】:

    试试这个:

    \[SECTION\].+?\[\/SECTION\]

    【讨论】:

    • 与 Kolink 的答案有什么区别?再次匹配从第一个开始标签到最后一个开始标签的所有内容作为一个匹配
    • Kolink 更好。我用 preg_match_all 尝试了表达式,它为您的给定数据提供了 3 个匹配项。