Autor Zpráva
Tomast
Profil
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
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
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
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
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
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
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
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
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
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
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
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> (= nic se nemění změní se jen cesta), a pokud míň tak se zobrazí jako miniatura s odkazem na plnou velikost?
okolojdouci
Profil *
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0