Autor | Zpráva | ||
---|---|---|---|
Tomast Profil |
#1 · Zasláno: 17. 6. 2011, 16:20:54
Zdravím, před 11 dny jsem se ptal na to, jak docílit přidání odkazu na obrázek, který je menší než xx pixelů. Trochu jsem jej upravil:
$src = "Blab bla <img style="display: block; margin-left: auto; margin-right: auto;" src="file/maly/img.jpg" alt="" width="404" height="254" /> bal bla"; function picReplace($matches) { $parts = explode(' ',$matches[0]); $width = $height = $src = ''; foreach ($parts as $att) { $pos = strpos($att,'='); $name = substr($att,0,$pos); $value = trim(substr($att,$pos+1), "\"'><"); if (in_array($name, array('height','width','src','alt','class','title','style'))) $$name = $value; $src=str_replace("file/images/sml/","",$src); $srcnm=$src; } return ($height*$width > 30000) ? "<img src='file/normalni/".$srcnm."' height='$height' title='$title' width='$width' alt='$alt' style='$style' class='$class' />" : "<a href='file/normalni/$srcnm' rel='lightbox'>$matches[0]</a>"; } $out = preg_replace_callback('~<img[^>]*>~i', 'picReplace', $src); Avšak zjistil jsem, že když mi to vypisuje $style, tak mi to skončí hned po display: a dál to nevypíše, takže předpokládám, že za to může mezera, zkoušel jsem sestavi fn, která by ostraňovala mezery v tagu style, ale nedělalo to dobrotu... Pradí někdo, jak odstranit mezery nebo upravit výše uvedený skript, aby mi vypsal celé $style? Díky |
||
Rellik Profil |
#2 · Zasláno: 17. 6. 2011, 16:38:43
Na styly je externí CSS soubor. Psát styl přímo do tagu je prasárna. Když to uděláš externím stylem máš to bez problému...
|
||
Tomast Profil |
#3 · Zasláno: 17. 6. 2011, 17:12:59
Problém je to, že jde o obrázek a každý obrázek má jiný styl a navíc se vše táhne z DB, což je myslím logické, když jsme ve tématu o PHP, protože kdybych to jel s obyčejným HTML, tak se nemusím vůbec drbat s tímhle skriptem!
|
||
Rellik Profil |
#4 · Zasláno: 17. 6. 2011, 17:22:39 · Upravil/a: Rellik
Proč by měl mít každá obrázek jiný styl?? Jinak nevím jaký styl by měl mít obrázek krom borderu a nějakého pozicování. Šířku a výšku není třeba uvádět a pokud má každý obrázek jiný styl jak říkáš, tak ho stejně píšeš přímo do tagu ke každému obrázku, tak nevím jaký je problém ho psát externě a obrázku nastavit konkrétní class..
Jinak nevím jakým složitým scriptem zjišťuješ jak je obrázek velký, když na to stačí 3 řádky kódu $velikost=getimagesize($obrazek); $sirka=$velikost[0]; $vyska=$velikost[1]; EDIT: Jo už sem to zjistil, ty to zjišťuješ z toho prasácky napsaného tagu... No myslím že dál nemá cenu o něčem diskutovat... howk! |
||
Tomast Profil |
#5 · Zasláno: 17. 6. 2011, 17:33:57
S těmahle radama si jdi do téma pro začátečníky... Ptal jsem se na jasnou věc a ne žádnou alternativu. Tinymce ti asi nic neříká (15 různě velkých obrázků na stránce, u každýho jiné float, margin, position, atd...), co? Přes něj nejdou ukládat zvlášť id nebo class. Příště když nevíš odpověď na mou otázku, radši neodpovídej.
Ještě jednou pro tebe vysvětlím, co chci: z 1.skriptu vypisuji zvlášť src, style, width, atd.... když vypisuji $style, tak mi to vypíše jen display: a víc ne, což by mělo ještě block; margin-left: auto; margin-right: auto; Ještě viz.: http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=126357 |
||
Tori Profil |
#6 · Zasláno: 17. 6. 2011, 17:38:15 · Upravil/a: Tori
Tomast:
Dá se spoléhat na to, že ten wysiwyg uloží atributy šířku a výšku pokaždé ve stejném pořadí (ať už bude okolo/mezi nimi cokoli)? By to možná šlo řešit změnou reguláru. |
||
Rellik Profil |
#7 · Zasláno: 17. 6. 2011, 17:43:26
Kdybys to napsal dřív, tak nebudu reagovat vůbec. Jinak pořád si stojím zatím, že zjištění rozměru obrázků je jednodušší tím co sem psal výš..
jinak myslím že to skončí díky uvozovkám to $src = by mělo vypadat spíš takhle: $src = "Blab bla <img style=\"display: block; margin-left: auto; margin-right: auto;\" src=\"file/maly/img.jpg\" alt=\"\" width=\"404\" height=\"254\" /> bal bla"; a nebo ho dát do jednoduchých uvozovek, aby jsi to nemusel escpovat... Jestli jde zase o něco jiného tak víc už neporadím... |
||
Tomast Profil |
#8 · Zasláno: 17. 6. 2011, 17:48:05 · Upravil/a: Tomast
Tori
Co jsem tak projížděl teď tu stránku, tak jako první ukládá style, src, alt, width, height, je to tak u všech obrázků, co jsem viděl. Takže myslím, že by se na to teoreticky dalo spolehnout. Jak tedy s tím regulárem? Rellik: Uvozovky jsou ten nejmenší problém. To byl jen nástin toho, co vypisuje DB, samozřejmě že ty uvozovky jsou v originále dobře. |
||
Tori Profil |
#9 · Zasláno: 17. 6. 2011, 18:13:08 · Upravil/a: Tori
Tomast:
Napadlo mne něco, co rozseká <img> na hodnoty výšky a šířky + bez rozlišení jakékoli atributy okolo nich. Zkuste, jestli by to bylo použitelné. Callback funkce by se musela dost přepsat, ale zase by byla jednodušší. Regulár zvládne zpracovat zalomení řádku uvnitř tagu i rozdíl html/xhtml, bohužel vyžaduje aby bez ohledu na zbytek řetězce byla zadaná nejdřív šířka, pak výška. $src = 'Blab bla <img style="display: block; margin-left: auto; margin-right: auto;" src="file/maly/img.jpg" alt="" width="404" height="254" /> bal bla'; $regex = '~<img(?<zacatek>[^>]*)? width=[\'"]?(?<sirka>\d+)[\'"]?(?<stred>[^>]*)? height=[\'"]?(?<vyska>\d+)[\'"]?(?<konec>[^>]*)?>~i'; preg_match($regex, $src, $matches); echo '<pre>'; var_dump($matches); |
||
Tomast Profil |
#10 · Zasláno: 17. 6. 2011, 18:36:41 · Upravil/a: Tomast
Zkusil jsem to nezasazovat do žádné funkce a vypsalo mi to tohle:
array(11) { [0]=> string(98) "<img style="float: right;" src="file/images/sml/sortiment1.JPG" alt="" height="112" width="200">" ["zacatek"]=> string(66) " style="float: right;" src="file/images/sml/sortiment1.JPG" alt=""" [1]=> string(66) " style="float: right;" src="file/images/sml/sortiment1.JPG" alt=""" ["sirka"]=> string(3) "200" [2]=> string(3) "200" ["stred"]=> string(0) "" [3]=> string(0) "" ["vyska"]=> string(3) "112" [4]=> string(3) "112" ["konec"]=> string(2) " /" [5]=> string(2) " /" } Co dál s tím? Nějak nevím.... EDIT: Pořád však platí možnost odkazů u měnší verze obrázku, tenhle skript je rozšíření pokud by byl obrázek už dostatečně velký, nahradil by se originálem. |
||
Tomast Profil |
#11 · Zasláno: 17. 6. 2011, 19:00:50 · Upravil/a: Tomast
Je to splácaný všechno dohromady, ale takhle jsem si s tím poradil a funguje to:
$input = "nějakej text z DB s obrázkama" function picReplace($matches) { $parts = explode(' ',$matches[0]); $width = $height = $src = ''; foreach ($parts as $att) { $pos = strpos($att,'='); $name = substr($att,0,$pos); $value = trim(substr($att,$pos+1), "\"'><"); if (in_array($name, array('height','width','src'))) $$name = $value; $src=str_replace("file/images/sml/","",$src); $srcnm=$src; } $regex = '~<img(?<zacatek>[^>]*)? width=[\'"]?(?<sirka>\d+)[\'"]?(?<stred>[^>]*)? height=[\'"]?(?<vyska>\d+)[\'"]?(?<konec>[^>]*)?>~i'; preg_match($regex, $matches[0], $final); return ($height*$width > 30000) ? "<img ".str_replace("file/images/sml/", "file/images/nor/", $final["zacatek"])." height='$height' width='$width'/>" : "<a href='size&$srcnm' rel='lightbox'>$matches[0]</a>"; } $out = preg_replace_callback('~<img[^>]*>~i', 'picReplace', $input); echo $out; |
||
Tori Profil |
#12 · Zasláno: 17. 6. 2011, 19:12:08 · Upravil/a: Tori
Jakže funguje to nahrazování cesty k obrázku?
Pokud má obrázek větší rozměr než 30000 px, tak se zobrazí v plné velikosti jako <img> (= |
||
okolojdouci Profil * |
#13 · Zasláno: 17. 6. 2011, 19:15:32
Mě by docela zajímalo, jestli třeba ve $width může být někdy něco jiného než prázdný string.
|
||
Tomast Profil |
#14 · Zasláno: 17. 6. 2011, 19:20:23
Tori
Ano, přesně tak to funguje, s tím, že se v editoru pracuje se zmenšenýma verzema obrázků, a pak při výpisu z DB se narazují. V editoru jsem si udělal uploader, který mi to hodí do dvou složek - jeden do zmenšený, druhý do normální. V editoru pracuji se zmenšeným, už kvůli objemu dat. Z DB se mi pak vytáhne přes tenhle skript text s obrázky a co je větší než 30000px se rovnou nahradí lepší verzí s tím, že se změní cesta (str_replace), co je menší, je klikací, třeba přes lightbox. okolojdouci $width je vždy naplněná nějakým číslem. |
||
Tori Profil |
#15 · Zasláno: 17. 6. 2011, 19:36:10
Nevím, jak to udělat nezávislým na pořadí atributů, s nimiž se pracuje (src, width, height), takže musí být v tomhle pořadí a vyplněné. Snad se dá spolehnout na editor, že má pevně nastavené pořadí, v němž je přidává (anebo někdo jiný poradí líp). Pokud může src obsahovat mezeru, tak ji vyhoďte z reguláru.
function picReplace($matches) { if ($matches['vyska'] * $matches['sirka'] > 30000) return str_replace("file/images/sml/", "file/images/nor/", $matches[0]); else return "<a href='".str_replace("file/images/sml/", "", $matches['src'])."' rel='lightbox'>$matches[0]</a>"; } $regex = '~<img([^>]*)? src=[\'"]?(?<src>[^ \'"]+)[\'"]?([^>]*)? width=[\'"]?(?<sirka>\d+)[\'"]?([^>]*)? height=[\'"]?(?<vyska>\d+)[\'"]?([^>]*)?>~i'; $out = preg_replace_callback($regex, 'picReplace', $text); |
||
Tomast Profil |
#16 · Zasláno: 17. 6. 2011, 22:03:16
I tak se to dá udělat - přehledněji. Jsi opravdu odbornice :-)
EDIT: Ta mezera v src se dá ošetřit už při uploadu. |
||
Časová prodleva: 13 let
|
0