我想得到一个单词列表,它被一个类似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
);
答案 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
)
)
答案 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;