2014-12-19 85 views
0

我需要一些幫助,下面的代碼。我在桌子上有一個字段,我需要替換各種標籤,並且已經確定了針對特定區域所需的正則表達式模式。這段代碼將這些代碼拉出來,並將它們剝離成我想要的格式,但是它將它們分配到了所有相同的「imageId」 - body中的最後一個。我知道它不是以正確的方式循環,只需要另一組眼睛就可以了。我感覺如果它通過Body並且一次替換一個標籤而不是在for循環中間,它可能會按照它應該做的。目前該領域的身體看起來是這樣的:PHP preg替換循環問題

<text:image id="12345" blah blah blah /> 

lots of text here 

<text:image id="123456" blah blah blah /> 

lots of text here 

<text:image id="7890" blah blah blah /> 

我希望它看起來像這樣:

<text:image id="12345"/> 

lots of text here 

<text:image id="123456" /> 

lots of text here 

<text:image id="7890" /> 

下面是代碼:

$textToReplace2 = mysqli_query($conn, "SELECT id, body from t1"); 
while($row2 = $textToReplace2->fetch_array()) { 
    $t1_id = $row2["id"]; 
    $body = $row2["body"]; 

    $oldBody = $body; 

    $pattern = '#(text:image id=)"\d+(.*)(/>)#'; 
    preg_match_all($pattern, $body, $matches); 

    foreach ($matches[0] as $match) { 
    $id=$match; 

    preg_match('#\d+#', $id, $nextMatches); 

    foreach ($nextMatches as $nextMatch) { 
     $imageId=$nextMatch; 

     $newBody = preg_replace($pattern, 'ID:'.$imageId, $body); 

     $newEscapedBody = mysqli_real_escape_string($conn, $newBody); 

     $update2 = "UPDATE T1 SET body = '$newEscapedBody' where id = '$t1_id'"; 
     $updateResult2 = mysqli_query($conn, $update2); 
    } 
    } 
} 
+0

所有那些括號在哪裏關閉? –

+0

複製粘貼問題,他們在那裏 – caro

+0

'UPDATE T1 SET body ='$ newEscapedBody'其中id ='$ t1_id''在這裏,您正在循環的每一步更新ID爲'$ t1_id'的記錄。在每一步中,您都會一次又一次更新相同的記錄。因此,循環最後一步中更新的值將保留在表中。 –

回答

0

Yeuch!

有幾種方法可以改善這一點。我沒有我的正則表達式測試器,但是像這樣...

while($row2 = $textToReplace2->fetch_array()) { 
    $t1_id = $row2["id"]; 
    $body = $row2["body"]; 
    $replace='$1>'; // some experimentation needed to find correct index 
    $new=preg_replace('#(<text\:image id="(\d+)")([^>]+)>#U', $replace, $body); 
    $newEscapedBody = mysqli_real_escape_string($conn, $new); 
+0

你能詳細說明你採取的索引方法嗎?只是想學 – caro

+0

閱讀pcre的,特別是子表達 – symcbean

+0

這工作得很好..需要'$ 2>'...謝謝! – caro