Проблема с регулярным выражением (PHP)

Суть в том, что почему-то выводится только первый ББкод из сообщения (БД MySQL), все остальные почему-то просто срезается. К примеру, есть сообщение: "Всем привет [id]1[/id]. Есть новое на [id]2[/id]"

Код:

function id($id){
$id = preg_replace('/\[id\]([0-9]+)\[\/id\]/', '$1', $id);
    $q = DB::$dbs->query("SELECT `id`,`name` FROM `station` WHERE `id` = '".$id."'");
        while($station = $q -> fetch())
        {
            return '[<a href="/'.$station[id].'">'.$station[name].'</a>]';
        }
}

Использую так:

echo id(message['id']);

Выводит:

"Всем привет [ссылка]. Есть новое на "

Почему так происходит?


Ответы (1 шт):

Автор решения: Slava Rozhnev

Вот возможное решение задачи:

<?php
function get_ids($str) {
    preg_match_all('/\[id\]([0-9]+)\[\/id\]/m', $str, $ids);
    return $ids[1];
}

function id_to_link($id){
    global $mysqli;
    
    $stmt = $mysqli->prepare('SELECT `id`,`name` FROM `station` WHERE `id` = ?');
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->bind_result($id, $name);
    
    while($station = $stmt -> fetch())
    {
        return '[<a href="/'.$id.'">'.$name.'</a>]';
    }
}

$ids =  get_ids('Всем привет [id]1[/id]. Есть новое на [id]2[/id]');

foreach ($ids as $id) {
    echo id_to_link($id);
}

PHP онлайн

→ Ссылка