一次。
我正在尝试浏览数据库表并替换旧BBCode的所有实例(即:[i:fs8d979]
)并将其替换为简单的BBCode([i]
)。但是,我的结果非常混乱。
$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
似乎脚本试图做两次,我不知道为什么。数据库字段也未更新。 为了调试的目的,我已经回应了所有的东西,所有的变量都设置好了,一切看起来都应该正常工作。 有什么建议吗?
答案 0 :(得分: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。
答案 1 :(得分:1)
首先:行
$posts[]['id'] = $row['post_id'];
$posts[]['text'] = $row['post_text'];
正在向$posts
数组添加两个元素。这就是为什么你每个帖子得到两个输出。
第二:我不认为冒号:
是一个特殊的角色 - 它不需要被转义。所以看起来应该是这样的:
$regex = "/\[(\D)(:[a-zA-Z0-9_]+)\]/";