0

例如我有这段数据:

array(
    1 => 'Metallica',
    2 => 'Megadeth',
    3 => 'Anthrax',
    4 => 'Slayer',
    5 => 'Black Sabbath',
);

我有这段文字:

我最喜欢的乐队是:#band{2},然后是:#band1。我的第一个金属乐队是:#band{5},我有时喜欢在听:#band3#band{4}的时候戴头。

所以在 RegEx 之后,它应该是这样的:

我最喜欢的乐队是:Megadeth,然后是:Metallica。我的第一支金属乐队是:Black Sabbath,有时我在听:AnthraxSlayer时喜欢戴头巾。

所以,我需要一个模式/示例如何从这两种模式中提取数字:

#band{NUMERIC-ID}#bandNUMERIC-ID

4

2 回答 2

0

尝试这样的事情

$txt = 'your text with bands';
foreach($arr as $key=>$val){
    $txt = preg_replace('/#band'.$key.'([^0-9])/', $val.'$1', $txt);
    $txt = preg_replace('/#band{'.$key.'}/', $val.'$1', $txt);
}

//detect the error
if(preg_match('/#band[^0-9]+/', $txt) || preg_match('/#band{[^0-9]+}/', $txt){
  //error!!!
}

//replace the non found bands with a string
$txt = preg_replace('/#band[^0-9]+/', 'failsafe', $txt);
$txt = preg_replace('/#band{[^0-9]+}/', 'failsafe', $txt);
于 2012-04-10T00:45:57.643 回答
0

不需要正则表达式,只需使用str_replace()

$map = array();
foreach ($bands as $k => $v){
    $map["#band".$k] = $v;
    $map["#band{".$k."}"] = $v;
}

$out = str_replace(array_keys($map), $map, $text);

演示:http ://codepad.org/uPqGXGg6

如果要使用正则表达式:

$out = preg_replace_callback('!\#band((\d+)|(\{(\d+)\}))?!', 'replace_band', $text);

function replace_band($m){
    $band = $GLOBALS['bands'][$m[2].$m[4]];
    return $band ? $band : 'UNKNOWN BAND';
}

演示:http ://codepad.org/2hNEqiCk

[编辑] 更新了多种形式的令牌以替换

于 2012-04-10T00:49:13.090 回答