2013-04-22 27 views
5

Ich analysiere eine Zeichenfolge vor dem Senden an eine DB. Ich möchte über alle <br> in dieser Zeichenfolge gehen und sie durch eindeutige Zahlen ersetzen, die ich von einem Array, gefolgt von einer neuen Zeile erhalten.Alle Vorkommen einer Zeichenfolge durch Werte aus einem Array ersetzen

Zum Beispiel:

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" 

Klingt einfach genug. Ich würde nur eine while-Schleife machen, alle Vorkommen von <br> mit strpos, und ersetzen Sie diese mit den erforderlichen Zahlen + \ n mit str_replace.

Problem ist, dass ich immer einen Fehler bekomme und ich habe keine Ahnung, was ich falsch mache? Wahrscheinlich ein dummer Fehler, aber immer noch nervig.

Hier ist mein Code

$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++; 
} 

Irgendwelche Ideen bitte?

Vielen Dank im Voraus,

+0

Nun zunächst, alle in der ersten Iteration Sie alle Instanzen ersetzen wird von ''
.... es auf diese Weise tun Sie nur REPLCE Teile des Strings mit 'substr_replace' haben würde, die lässt Sie definieren die Positionen für den Ersatz. – prodigitalson

Antwort

6

ich einen regulären Ausdruck und eine benutzerdefinierte Callback wie folgt verwenden würde:

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

Beachten Sie, dass davon ausgegangen wird, dass das Array $replace geändert werden kann. Wenn das nicht der Fall ist, können Sie einen Zähler halten:

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

Sie aus this demo, dass diese Ausgänge sehen:

Line 1 Line 2 Line 3 Line 4 
+0

Sie antworten Arbeiten und Str wird korrekt analysiert, aber aus irgendeinem Grund wird es nicht in die Datenbank eingefügt, wenn ich INSERT INTO aufrufen. Irgendwelche Ideen warum? – r3x

+0

@ r3x - Wie kommt es? Haben Sie eine Fehlermeldung? Wenn Sie die literalen '\ n'-Zeichen drucken möchten, anstatt PHP das zu dem Newline-Zeichen interpretieren zu lassen, ändern Sie die doppelten Anführungszeichen um' "\ n" 'in einfache Anführungszeichen. – nickb

+0

Hier ist meine Einfüge-Abfrage (interestTable ist im Grunde die analysierte Zeichenfolge). mysql_query ("INSERT INTO $ tbl_name (BenutzerID, storyID, rank, storyType, interestTable) VALUES ('$ userID', '$ storyID', '$ rank', '$ storyType', '$ interestTable')", $ dbh1); 'Wenn ich den Wert von interestTable von dieser Abfrage lösche, dann funktioniert alles gut, aber wenn ich es addiere, wird nichts gesendet. Was den Fehler betrifft, habe ich keinen bekommen. Seltsam: S – r3x

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

Dies ist ersetzt ALLE die Vorkommen von <br> es findet.

Der richtige ist nur einen einzigen Ersatz pro Iteration zu tun: substr_replace kann einen einzelnen Teil einer Zeichenfolge ersetzen. Richtig wäre:

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++; 
} 

(! Den $ vor dem replaceIndex nicht vergessen $replaceIndex ist eine Variable)

+1

Der 4. Parameter zu 'str_replace' ist nicht wie oft zu ersetzen. Es ist eine Referenz, die darauf eingestellt ist, wie viel Zeit es * ersetzt hat. –

0

Sie müssen die $ vor Variablen erinnern. Versuchen Sie auch, die php regex function zu verwenden, die die Anzahl der Ersetzungen angibt.

<?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

Der letzte Parameter lässt Sie die Anzahl der Ersetzungen nicht festlegen. Es ist eine Referenz, die auf die Anzahl der Ersetzungen gesetzt ist, die es getan hat. –

+0

Ich beziehe mich auf die Variable $ limit in [preg_replace] (http://php.net/manual/en/function.preg-replace.php). – George

+0

Ich dachte, Sie verwenden den '$ count' Parameter. Macht nichts :-) –

1

Wenn Sie nur zählen möchten, können Sie dies auch verwenden.

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

Wenn Sie die gefundenen Elemente durch ein eigenes Array ersetzen möchten, können Sie 'str. = ($ Index + 1)' in 'str. = $ MyArray [index];' ändern – ikkez

0

Hier ist meine Version. 8 formatierte Zeilen, keine Regex, 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; 
Verwandte Themen