совпадения регулярного выражения php и замена - PullRequest
1 голос
/ 23 сентября 2011

еще раз.Я пытаюсь пройти таблицу базы данных и заменить все экземпляры старого 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 ]

3 голосов
/ 23 сентября 2011

В точке в коде:

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

Вы создаете две записи в массиве, одну с идентификатором, за которым следует текст.

Я думаю, что вы хотите:

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, в котором не было идентификатора записи.

1 голос
/ 23 сентября 2011

Первое: строки

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

добавляют два элемента в массив $posts.Вот почему вы получаете два вывода на пост.

Второе: я не думаю, что двоеточие : - это специальный символ - его не нужно экранировать.Так должно выглядеть:

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