Solo che mentre questo script contiene i titoli in un array, io vorrei che l'id passato con [libro=3] determini l'esecuzione di una query su db.
L'avevo capito, ma quelli che ti forniamo qui sono sempre dei codici di esempio: li devi adattare alle tue esigenze. Se vuoi qualcosa di più specifico, questo è il lavoro che dovresti fare:


codice:
$text = "I miei libri preferiti sono:\n[libro=1] e [libro=201]";

if (preg_match_all('/\[libro=([0-9]+)\]/', $text, $ids)) {
    $ids = array_unique(array_filter($ids[1], function($id) {
        return intval($id);
    }));

    // qui la query, del tipo:
    // $query = 'SELECT nome, autore, copertina FROM books WHERE id IN('.implode(', ', $ids).')';
    // in $result recupero tutti i risultati della query

    $text = preg_replace_callback('/\[libro=([0-9]+)\]/', function($book) use ($result) {
        $bookId = $book[1];

        if (...) { // controllo se esiste in $result un libro che ha l'id $bookId.
            return "..."; // restituisco l'output modificato, utilizzando $result 
        }

        // il libro non esiste, che faccio? lancio una eccezione? o lo gestisco silenziosamente?
    }, $text);
}

echo $text;