2012-02-22 10 views
2

正しい正規表現を見つけるのが難しいです。preg_replaceとの複雑な正規表現。[と]の中にない単語を置き換えてください。

私はそのような文があります。

Hi, my name is Stan, you are welcome, hello. 

を、私はそのようにそれを変換したい:サムス言葉が交換されていないので、

[hi|hello|welcome], my name is [stan|jack] you are [hi|hello|welcome] [hi|hello|welcome]. 

は今、私の正規表現は半分、働いています、そして、交換したものをここではいくつかの文字に

を削除している私のテストコードは

です

すべてのヘルプは

答えて

3

正規表現はovercomplicatedです。あなたは、単に)(通常のブラケットを使用して正規表現置換を使用する必要があります。

<?php 

$test = 'Hi, my name is Stan, you are welcome, hello.'; 

$words = array(
     array('hi', 'hello', 'welcome'), 
     array('stan', 'jack'), 
     ); 

$result = $test; 
foreach ($words as $group) { 
    if (count($group) > 0) { 
     $imploded = implode('|', $group); 
     $replacement = "[$imploded]"; 
     $search = "($imploded)"; 
     $result = preg_replace("/$search/i", $replacement, $result); 
    } 
} 

echo $test . '<br />' . $result; 
+0

を参照してください – Bouki

1

preg_replaceをパラメータとして配列をサポートして理解されるであろう。ループを繰り返す必要はありません。

$s = array("/(hi|hello|welcome)/i", "/(stan|jack)/i"); 
$r = array("[hi|hello|welcome]", "[stan|jack]"); 
preg_replace($s, $r, $str); 

または動的

$test = 'Hi, my name is Stan, you are welcome, hello.'; 
$s = array("hi|hello|welcome", "stan|jack"); 
$r = array_map(create_function('$a','return "[$a]";'), $s); 
$s = array_map(create_function('$a','return "/($a)/i";'), $s); 
echo preg_replace($s, $r, $str); 
//[hi|hello|welcome], my name is [stan|jack], you are [hi|hello|welcome], [hi|hello|welcome]. 
1

あなたの正規表現:

'#([^\[])' . $word . '([^\]])#i' 

も同様$wordの前後に1つの文字に一致します。そして彼らがそうするように、彼らはそれを置き換えます。だからあなたの置換文字列は、あまりにも、これらの部品を参照する必要があります:あなたが使用している

'$1' . $replacement . '$2' 

Demo

+0

ハイテク を、これはうまく動作し、それは直前の文字(あなた」を持っていないので、しかし、最初の単語(HI)は、 – Bouki

+0

確かに交換されていませんregexで探しています)。だから '['、 '|'や '^'(文字列の始まり)を探すべきではありません。最後にも同じ。 http://codepad.org/0Zey2pk3 – hakre

関連する問題