2012-04-10 8 views
0

私はデータのこの作品がありますRegEx:パターンから値/数値を抽出し、それを別のものに置き換えるにはどうすればよいですか?例えば

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

をそして、私は、テキストのこの部分を持っている:

私の最初の好きなバンドは次のとおりです。#band {2}、それはだ、その後:#band1#band {5}とを聞きながら私は時々 ヘッドバンギングを楽しむ:私 オーバー全ての第1の金属バンドがあった#band3又は#band {4}

だから、正規表現の後に、それは次のようになります。メガデス、その後それはです::

私の最初のお気に入りのバンドがあるメタリカ。 マイ過全ての第1メタルバンドだった:ブラックサバス、およびを聞きながら、私は時々 ヘッドバンギングを楽しむ:炭疽菌またはスレイヤー。したがって

、私は、これらの二つのパターンから数値を抽出する方法をパターン/たとえばが必要:

#band {数値ID}又は#bandNUMERIC-ID

答えて

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); 

デモ:

$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

[正規表現を使用したい場合はhttp://codepad.org/uPqGXGg6

置換するトークンの複数の形式のために更新されました

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); 
+0

インデックスが配列に存在しない場合は、ここでフェイルセーフを追加できますか? –

+1

インデックスが存在しない場合はどうなりますか? – g3rv4

+0

そのエラーを処理するのは私の責任です...しかし、あなたはコードの観点からそのexpectionをどう扱うでしょうか? –

関連する問題