php正则表达式匹配和替换

时间:2011-09-23 04:17:44

标签: php regex preg-replace preg-match

一次。 我正在尝试浏览数据库表并替换旧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

似乎脚本试图做两次,我不知道为什么。数据库字段也未更新。 为了调试的目的,我已经回应了所有的东西,所有的变量都设置好了,一切看起来都应该正常工作。 有什么建议吗?

2 个答案:

答案 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_]+)\]/";