在括号[/​​ tag]中获取[tag]包围的单词

时间:2017-06-07 12:26:05

标签: php regex

我想得到一个单词列表,它被一个类似BBCode的"标签"包围。

E.g:

$string = "Hello [tag]world[/tag], how [notag]are[/notag] you today? I am [tag]fine[/tag].";

这应该返回一个这样的数组:

  • 世界

因为两者都被[tag]包围,但是"是"不应该添加,因为它被另一个标记包围。

目前我尝试以这种方式检查和替换调查结果:

$e->innertext = preg_replace(
                                '/\b' . preg_quote( "[tag]".$text."[/tag]", "/" ) . '\b/i',
                                "<a href='$url'>\$0</a>",
                                $e->innertext,
                                1
                            );

3 个答案:

答案 0 :(得分:2)

这应该有效 -

preg_match_all('/\[tag\](.*?)\[\/tag\]/', $string, $match);

<强>输出

Array
(
    [0] => Array
        (
            [0] => [tag]world[/tag]
            [1] => [tag]fine[/tag]
        )

    [1] => Array
        (
            [0] => world
            [1] => fine
        )

)

Code

答案 1 :(得分:1)

使用lookbehind和lookahead,您可以避免捕获组。

代码(Demo):

$string = "Hello [tag]world[/tag], how [notag]are[/notag] you today? I am [tag]fine[/tag].";
var_export(preg_match_all('/(?<=\[tag\])[^[]+(?=\[\/tag\])/',$string,$out)?$out[0]:[]);

输出:

array (
  0 => 'world',
  1 => 'fine',
)

或者对于模式速度(比Sougata的模式更快),使用具有否定字符类(Pattern Demo)的捕获组:

$string = "Hello [tag]world[/tag], how [notag]are[/notag] you today? I am [tag]fine[/tag].";
var_export(preg_match_all('/\[tag\]([^[]+)\[\/tag\]/',$string,$out)?$out[1]:[]);

答案 2 :(得分:1)

您也可以尝试使用此代码..

<?php
 $string = "Hello [tag]world[/tag], how [notag]are[/notag] you today? I am [tag]fine[/tag].";
 $s2 = explode('[tag]', $string);
 $s3 = array();
 foreach($s2 as $val){
 if (strpos($val, '[/tag]') !== false) {
   $s3[] = explode('[/tag]', $val)[0];
  }
}
echo '<pre>'; print_r($s3);

&GT;