Img visszaolvasva az adatbázisból (base64)

Img visszaolvasva az adatbázisból (base64)
2020-12-12T10:00:27+01:00
2020-12-13T13:12:38+01:00
2022-12-06T15:05:39+01:00
tivisu
Sziasztok,
az adatbázisba bevittem egy fotót szöveggel együtt. Vagyis, szöveg van a táblázatban és a végére beillesztve a fotó. Visszaolvasáskor viszont a kép mérete miatt a kép kívül esik a "div"-en. szeretnék beilleszteni egy class-t az img tag-ba... konkrétan: pillanatnyilag így néz ki a visszaolvasás:


<img style="width: 600px;" src="data:image/jpeg;base64,/9j/4.....


szeretném kivenni a style-t komplett, és helyette beiktatni a class="img-fluid" tagot.

Előre is köszönöm.
T
Mutasd a teljes hozzászólást!
Hali!

Habár én sem látom értelmét, hogy miért a teljes img tag-et tárolod, de – amennyiben szabályos a HTML-kód – megoldható több lépésben:
1. A style attribútumot törlöd.
2. Ha van class attribútum, akkor az értékébe beszúrod az img-fluid sztringet.
3. Ha nincs class attribútum, akkor az img tag-be beszúrod a class="img-fluid" sztringet.

Például:
$replaceRules = [ '/(<img\s+[^>]*)(style\s*=\s*([\'\"])[^\3]*?\3)([^>]*?>)/is' => '$1$4', '/(<img\s+[^>]*)(class\s*=\s*([\'\"]))([^\3]*?)\3([^>]*?>)/is' => '$1$2$4 img-fluid$3$5', '/(<img\s+)(?![^>]*class\s*=\s*([\'\"])[^\2]*?\2)([^>]+>)/is' => '$1class="img-fluid" $3', ]; $text1 = '<img title="Picture" class="pic-01" src="picture.png" alt="Pic" style="border:1px solid black;margin:2px" width="100" height="100"/>'; $text2 = '<img title="Picture" src="picture.png" alt="Pic" style="border:1px solid black;margin:2px" width="100" height="100"/>'; print_r([ htmlspecialchars(preg_replace(array_keys($replaceRules), $replaceRules, $text1)), htmlspecialchars(preg_replace(array_keys($replaceRules), $replaceRules, $text2)), ]);
Továbbfejlesztési javaslat: ugyan hibát nem okoz, ha egy osztálynév többször szerepel a class tulajdonság értékében, de próbáld meg azt is kiszűrni, hogy csak akkor szúrod be az img-fluid-ot, ha már nincs a class-ben.

Mutasd a teljes hozzászólást!

  • Hajrá, én drukkolok neked. Ha konkrét kérdésed is lesz, majd azt is írd ide

    (A témanyitó hozzászólásodban nem volt kérdés, csak kívánság.)
    Mutasd a teljes hozzászólást!
  • Közben úgy dntttem, hogy mégis upload módon oldom meg a képeket, nem teszem be az adatbázisba.
    Azért, köszönöm.
    T
    Mutasd a teljes hozzászólást!
  • Mi köze van annak, hogy hol tárolod a képeket ahhoz, hogy milyen style vagy class attribútumot raksz az img tagre?

    Ha elfogadsz egy tanácsot: először próbáld megérteni, mit csinálsz, és utána kérdezz. Ha te se érted, hogy mit akarsz elérni és hol akadtál el vele, akkor nem fogsz tudni értelmesen kérdezni se. Ebből lesznek aztán az ilyen katyvasz "kérdések", aminek se füle se farka.
    Mutasd a teljes hozzászólást!
  • Hali!

    Amint elárulod, hogy az elfogadott hozzászólás miként megoldás a felvetett problémádra (és a magyarázat helytálló), elfogadhatod ismét. Addig nem, az értelmetlen válasz-elfogadást érvénytelenítettem, a téma továbbra is nyitott.

    Mutasd a teljes hozzászólást!
  • Lényegében egy regex-re lenne szükségem ahhoz, hogy a visszaolvasott képben a style tagot teljes mértékben töröljem és a class="img-fluid" tagot tegyem helyette.
    Ez volt a lényege a kérdésermnek.
    Mutasd a teljes hozzászólást!
  • Miért tárolod egyáltalán a HTML markupot ahelyett, hogy PHP kóddal generálnád? Nem értem a dolog logikáját.

    Regexszel HTML-t értelmezni nem lehet általános esetben. Ha van valami extra információd, akkor esetleg meg lehet oldani, de nem túl elegáns. Ha mondjuk tudod hogy az img tag első attribútuma lesz a style és idézőjelben lesz, akkor:

    <img\s+(style\s*=\s*"[^"]*)"
    és a capture group tartalmát cseréled.
    Mutasd a teljes hozzászólást!
  • Hali!

    Habár én sem látom értelmét, hogy miért a teljes img tag-et tárolod, de – amennyiben szabályos a HTML-kód – megoldható több lépésben:
    1. A style attribútumot törlöd.
    2. Ha van class attribútum, akkor az értékébe beszúrod az img-fluid sztringet.
    3. Ha nincs class attribútum, akkor az img tag-be beszúrod a class="img-fluid" sztringet.

    Például:
    $replaceRules = [ '/(<img\s+[^>]*)(style\s*=\s*([\'\"])[^\3]*?\3)([^>]*?>)/is' => '$1$4', '/(<img\s+[^>]*)(class\s*=\s*([\'\"]))([^\3]*?)\3([^>]*?>)/is' => '$1$2$4 img-fluid$3$5', '/(<img\s+)(?![^>]*class\s*=\s*([\'\"])[^\2]*?\2)([^>]+>)/is' => '$1class="img-fluid" $3', ]; $text1 = '<img title="Picture" class="pic-01" src="picture.png" alt="Pic" style="border:1px solid black;margin:2px" width="100" height="100"/>'; $text2 = '<img title="Picture" src="picture.png" alt="Pic" style="border:1px solid black;margin:2px" width="100" height="100"/>'; print_r([ htmlspecialchars(preg_replace(array_keys($replaceRules), $replaceRules, $text1)), htmlspecialchars(preg_replace(array_keys($replaceRules), $replaceRules, $text2)), ]);
    Továbbfejlesztési javaslat: ugyan hibát nem okoz, ha egy osztálynév többször szerepel a class tulajdonság értékében, de próbáld meg azt is kiszűrni, hogy csak akkor szúrod be az img-fluid-ot, ha már nincs a class-ben.

    Mutasd a teljes hozzászólást!
  • Lényegében minden kép csak a style="width: 600px"-et tartalmazza és csak ezt kellene átcserélnem. Az adatbázisba beiktatott kép nem tartalmaz mást. A class azért kell, hogy a visszaolvasáskor (kiíráskor) a kép ne "csússzon" ki az adott keretből, hanem arányosan kicsinyedjen.
    Mutasd a teljes hozzászólást!
  • Hali!

    Lényegében…

    … teljesen lényegtelen, hogy milyen tulajdonságokat tartalmaznak a HTML img tag-ek az adatbázisban, az igényeidnek megfelelően történnek a szöveg-törlések/-cserék. Gondolom, kipróbáltad.

    Mutasd a teljes hozzászólást!
  • Igen, látom,  a második változat kell nekem, amikor egyáltalán nincs class.. viszont hasznos az első is, mert előfordult már, hogy hozzá kellett adnom attribútumot.

    Köszönöm!!!!
    T
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd