2011-09-23 56 views
1

再次。 我試圖通過一個數據庫表,並替換舊的BBCode(即:[i:fs8d979])的所有實例,並用簡單的BBCode([i])替換它。但是,我收到了令人困惑的結果。php正則表達式匹配和替換

$root_path = './'; 
include($root_path.'includes/common.php'); 

$posts = array(); 
$sql = 'SELECT post_id, post_text FROM posts'; 
$db->query($sql); 
while($row = $db->fetch_assoc()) 
{ 
    $posts[]['id'] = $row['post_id']; 
    $posts[]['text'] = $row['post_text']; 
} 

foreach($posts as $post) 
{ 
    $regex = "/\[(\D)(\:[a-zA-Z0-9_]{1,})\]/"; 

    if(preg_match($regex, $post['text'], $matches)) 
    { 
     $string = preg_replace('/'.$matches[2].'/', '', $post['text']); 
     $sql = 'UPDATE posts SET post_text = "'.$string.'" WHERE post_id = '.$post['id']; 
     $db->query($sql); 
     echo $post['id'].'--Matched and replaced<br />'; 
    } 
    else 
    { 
     echo $post['id'].'--No Match<br />'; 
    } 
} 
echo 'done'; 

當我運行該腳本,我得到的輸出是這樣的:

1302--No Match 
--No Match 
1303--No Match 
--No Match 
17305--No Match 
--Matched and replaced 
5532--No Match 
--No Match 
17304--No Match 
--No Match 
1310--No Match 
--No Match 

它會出現腳本試圖做的一切兩次,我不知道爲什麼。數據庫字段也沒有得到更新。 爲了調試的目的,我回應了所有的東西,並且設置了所有變量,並且所有變量看起來都應該正常工作。 有什麼建議嗎?

回答

3

在代碼中的點:

while($row = $db->fetch_assoc()) 
{ 
    $posts[]['id'] = $row['post_id']; 
    $posts[]['text'] = $row['post_text']; 
} 

你正在創建數組中的兩個條目,一個id爲,後跟文本。

我想你想:

while($row = $db->fetch_assoc()) 
{ 
    $posts[] = array('id' => $row['post_id'], 'text' => $row['post_text']); 
} 

這可以解釋爲什麼每一個正在發生兩次並沒有什麼正在發生變化。

調試是顯示錯誤的值過:

echo $post['id'].'--Matched and replaced<br />';

輸出功率爲

--Matched and replaced這表明沒有帖子的ID。

+0

就是這樣。我知道我必須做些愚蠢的事情。大聲笑。謝謝! – chaoskreator

1

第一:線

$posts[]['id'] = $row['post_id']; 
$posts[]['text'] = $row['post_text']; 

正在添加兩個元件的陣列$posts。這就是爲什麼你每個職位獲得兩個輸出。

第二:我不認爲冒號:是一個特殊字符 - 它不需要被轉義。所以它應該看起來像:

$regex = "/\[(\D)(:[a-zA-Z0-9_]+)\]/"; 
+0

你是對的,冒號不是需要逃跑的特殊字符。 – chaoskreator