2013-04-22 10 views
5

から値を持つ文字列の出現をすべて交換します。その文字列にある<br>をすべて読み込み、配列から取得したnewLineの固有の番号で置き換えます。例えば私はDBに送信する前に文字列を解析しています配列

str = "Line <br> Line <br> Line <br> Line <br>" 
$replace = array("1", "2", "3", "4"); 

my function would return 
"Line 1 \n Line 2 \n Line 3 \n Line 4 \n" 

は十分に簡単に聞こえます。私は、whileループを行う<br>使用strposのすべての回出てくる取得し、必要な数字+ \ nはstr_replaceを使用して、それらを置き換えます。

問題は、私は常にエラーを取得し、私は私が間違っているの何見当がつかないということでしょうか?おそらくダムの間違いですが、それでも迷惑です。ここで

はすべてのアイデアは私のコード

$str  = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$replaceIndex = 0; 

while(strpos($str, '<br>') != false) 
{ 
    $str = str_replace('<br>', $replace[index] . ' ' .'\n', $str); //str_replace, replaces the first occurance of <br> it finds 
    index++; 
} 

してくださいますか?これは事前に

おかげで、

+0

まあ、....それをあなたが 'できsubstr_replace'を使用して文字列の唯一replce部分に持っているでしょうこの方法を行うには彼の置換のためのポーションを定義します。 – prodigitalson

答えて

6

私はこのように、正規表現とカスタムコールバックを使用します。

$str = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$str = preg_replace_callback('/<br>/', function($match) use(&$replace) { 
    return array_shift($replace) . ' ' . "\n"; 
}, $str); 

これは、$replace配列を変更できることを前提としています。それはそうではないなら、あなたはカウンターを維持することができます:あなたはこの出力というthis demoから見ることができます

$str = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$count = 0; 
$str = preg_replace_callback('/<br>/', function($match) use($replace, &$count) { 
    return $replace[$count++] . ' ' . "\n"; 
}, $str); 

:あなたは、変数の前に$を覚えておく必要が

Line 1 Line 2 Line 3 Line 4 
+0

あなたは答え、strは正しく解析されますが、何らかの理由でINSERT INTOを呼び出すとDBに挿入されません。 理由は何ですか? – r3x

+0

@ r3x - どうしたの?エラーメッセージがありますか? PHPに改行文字を解釈させる代わりに '\ n'文字を表示する場合は、二重引用符を一重引用符に変更してください。 – nickb

+0

ここに私の挿入クエリです(interestTableは基本的に解析された文字列です)。 ( '$ userID'、 '$ storyID'、 '$ rank'、 '$ storyType'、 '$ interestTable') "、$ dbh1" mysql_query( "INSERT INTO $ tbl_name(userID、storyID、rank、storyType、interestTable) ); 'このクエリからinterestTableの値を削除すると、すべて正常に動作しますが、追加しても何も送信されません。エラーに関しては、私は何も得ていませんでした。奇妙なこと:S – r3x

1
$str = str_replace('<br>', $replace[$index] . ' ' .'\n', $str); 

は、それが見つかった<br>ALL出現箇所を置き換えます。

正しいだけで、反復ごとに1回の交換を行うことです:substr_replaceは、文字列の1つの部品を交換することができます。正しいは次のようになります。

while($pos = strpos($str, '<br>') !== false) 
{ 
    $str = substr_replace($str, $replace[$replaceIndex] . ' ' .'\n', $pos, 4); // The <br> is four bytes long, so 4 bytes from $pos on. 
    $replaceIndex++; 
} 

は(!replaceIndex$を忘れないでください$replaceIndex変数である)

+1

'str_replace'の4番目のパラメータは、何回置換するかではありません。それは何回*置き換えられたのかを示すリファレンスです。 –

0

。また、置換数を指定できるphp regex functionを試してください。

<?php 
$str  = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$index = 0; 
$count = 1; 

while(strpos($str, '<br>') != false) 
{ 
    $str = preg_replace('/<br>/', $replace[$index] . " \n", $str, 1); //str_replace, replaces the first occurance of <br> it finds 
    $index++; 
} 
echo $str 
?> 
+0

最後のパラメータでは、置換の数を設定できません。それは、それが*行った置換の数に設定されている参照です。 –

+0

私は[preg_replace](http://php.net/manual/en/function.preg-replace.php)の$ limit変数を参照しています。 – George

+0

あなたは '$ count'パラメータを使っていると思いました。決して気にしないでください:-) –

1

これを数えたい場合は、これも使用できます。

$str_expl = explode('<br>',$str); 
foreach($str_expl as $index=>&$str) 
    if(!empty($str)) 
     $str .= ($index+1); 
$str = implode($str_expl); 
+0

見つかった項目を自分の配列に置き換えたい場合は、 'str。=($ index + 1)'を 'str。= $ myArray [index];に変更することができます。 – ikkez

0

私のバージョンです。 8形式の行、正規表現はありません、KISS。あなたが ``
のすべてのインスタンスを置換する最初の反復におけるすべての最初の

$str = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 

$temp = explode("<br>", $str); 
$result = ""; 
foreach ($temp as $k=>$v) { 
    $result .= $v; 
    if ($k != count($temp) - 1) { 
     $result .= $replace[$k]; 
    } 
} 

echo $result; 
関連する問題