embed content into blog..

vasilev

Registered
Здравейте,
искам да заменя това:

[diagram=O7Jv536S]

със данни за тази диаграма от базата спрямо ID - 07Jv..
текстът може да е много голям който съдържа този стринг.
има ли някакъв универсален и по добър начин от следния:

if (strpos($text, 'diagram') !== false) {
... take text from "diagram=" to "]"
select from table;
remove text [diagram="ID"] със данните от базата
}

мерси !
 
Какво може да съдържа този текст като знаци? Само букви и цифри?

Също, да разбирам, че това ще е нещо като bbcode някъде? В такъв случай ти трябва един regex да екстрактва това:

Код:
#\[diagram=([a-z0-9]+)\]#i

Тест
 
да.. по добре да покажа какво съм направил :)
въпроса е има ли по-добър начин.


Код:
if (strpos($zobj['text'], 'diagram') !== false) {
          $offset = 0;
          $text=$zobj['text'];
          while (($pos = strpos($text, 'diagram', $offset)) !== FALSE) {
            $offset   = $pos + 1;
            $desid=substr($text,($pos+8),8);
            if(!empty($desid)){
              $sqlin="SELECT imgdata FROM ...";
 ..
              if($zobjin = $qin->fetch(PDO::FETCH_ASSOC)){
                $desdata=$zobjin["imgdata"];
                $text=str_replace("[diagram=$desid]","<img style='max-width:100%;' src='$desdata'>",$text);
              }
            }     
          }
          echo $text;
        } else {
           echo $zobj['text'];
        }
 
Има. Създал си напразни сложнотии.

Ето ти пример: http://sandbox.onlinephpfunctions.com/code/e88849dee2b7e0a143c6d9a7bd09f3eb5fcbfc06

Махаш всичко, което си дал. В getDiagramDataById() слагаш SELECT заявката и връщаш image data. Дал съм ти пример, който е закоментиран във функцията.

Ако искаш невалидни диаграми да бъдат премахвани изцяло замени регулярния израз с:

Код:
#\[diagram=(.*?)\]#i



Ще сложа и кода тука, в случай, че линка някой ден си замине.

Код:
<?php

$text =<<< TEXT
    Very very long text with digrams

    [diagram=89s900a9s8d77s]

    text text text

    [diagram=ivalid-id]

    text text

    [diagram=]

    [diagram=aasd0989009s8d]
TEXT;

function getDiagramDataById($diagramId) {
    // // Това замества твоя SELECT
    // $query = "SELECT ....";
    // // ...

    // if ($results = $qin->fetch(PDO::FETCH_ASSOC)) {
    //     $imageData = $results['imgdata'];

    //     if (!empty($imageData)) {
    //         return $imageData;
    //     }
    // }

    // return null;


    $diagrams = [
        'aasd0989009s8d' => "/image/aasd0989009s8d.jpg",
        '8s8s8d9a99sd7s' => "/image/8s8s8d9a99sd7s.jpg",
        '89s900a9s8d77s' => "/image/89s900a9s8d77s.jpg",
    ];

    if (!array_key_exists($diagramId, $diagrams)) {
        return null;
    }

    return $diagrams[$diagramId];
}

function replaceDiagramsWithImage($text) {
    return preg_replace_callback("#\[diagram=([a-z0-9]+)\]#i", function ($matches) {
        $imageData = getDiagramDataById($matches[1]);
        
        if ($imageData === null) {
            return null;
        }

        return "<img style='max-width:100%;' src='{$imageData}'>";
    }, $text);
}

$text = replaceDiagramsWithImage($text);

echo $text;
 
Здравей,
Благодаря, да така е по-добре.
Само че снимките са base64 encoded .. забравих да напиша.
Ако ги вкарам в array , дали няма да вземат голям ресурс?
 
Не не, остави масива. Кода с масива е само примерен. Това, което е отгоре е това, което ти трябва да имаш, а именно селект заявката.

Код:
function getDiagramDataById($diagramId) {
    $query = "SELECT imgdata FROM ... WHERE id = :id";
    
    $qin = $dbh->prepare($query);
    $qin->execute([':id' => $diagramId]);

    if ($results = $qin->fetch(PDO::FETCH_ASSOC)) {
        $imageData = $results['imgdata'];

        if (!empty($imageData)) {
            return $imageData;
        }
    }

    return null;
}

Ето това ти е функцията. Вече си го нагласи, както ти си правиш заявката и т.н.
 

Горе