Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Kuvan mittojen hakeminen automaattisesti...

Sivun loppuun

timodemus [02.04.2009 17:42:19]

#

Olen tekemässä selaimessa päivitettävää sivustoa, johon teen omia tageja.
Esim: sivulle lisätään kuva seuraavasti:

[kuva]kuva.jpg[/kuva]

(kuvatiedosto on siis jo valmiiksi palvelimella...)

teksti siirretään muuttujaan $teksti ja se muutetaan muotoon:

<img src="kuva.jpg">

Muutos tehdään tällä koodilla:

<?php
$teksti = str_replace('[kuva]', '<img src="', $teksti);
$teksti = str_replace('[/kuva]', '">', $teksti);

echo $teksti;
?>

Kuvalle saa haettua mitat seuraavalla koodilla:

<?php
$kuva = "kuva.jpg";
list($width, $height, $type, $attr) = getimagesize($kuva);
echo '<img src="' . $kuva . '" width="' . $width . '" height="' . $height . '" alt="">';
?>

Mutta miten nämä koodit voisi yhdistää?
Eli kun kirjoitetaan (kuvan nimi puuttuu!) kuva.jpg[/kuva], niin lopputulos olisi esim:

<img src="kuva.jpg" width="60" height="80">

Tumettaja [02.04.2009 18:30:37]

#

$teksti = str_replace("[kuva]", "<img src=\"", $teksti);
$teksti = str_replace("[/kuva]", "\" width=\"" . $width . "\" height=\"" . $height . "\">", $teksti);

timodemus [02.04.2009 18:34:02]

#

Tuo koodi toimii kyllä, jos lisättäviä kuvia on vain yksi, mutta tässä tapauksessa kuvia on kymmeniä ja niitä vaihdetaan välillä.

Sivua päivitetään siis salasanasuojatulla lomakkeella jossa muokataan lähdekoodia tekstikentässä.

Muuten olen saanut päivityslomakkeen toimimaan, ainoa ongelma on kuvien mittojen hakeminen automaattisesti.

Päivitettävä sivu voisi näyttää lomakkeella esim tältä:

[otsikko]Sivun otsikko[/otsikko]
[kuva]kuva1.jpg[/kuva]
[kuvateksti]kuvateksti1[/kuvateksti]
[kuva]kuva2.jpg[/kuva]
[kuvateksti]kuvateksti2[/kuvateksti]
[linkki]http://www.sivu.fi/[/linkki]

eq [02.04.2009 19:33:26]

#

Jotta voit selvittää kuvan koon getimagesizen avulla, täytyy sinun jossain vaiheessa selvittää kuvan nimi, eikä vain vaihtaa merkkejä sen ympäriltä. Väitän, että helpoin tapa tämän (kaiken) toteuttamiseen ovat säännölliset lausekkeet, ja että löydät ainakin lähes kaiken tarvittavan tiedon valmiina tästä 'putkan oppaasta

Huomioithan, että PHP:ssa suositeltava tapa lausekkeiden osien jatkokäsittelyyn ovat (ohjeessa neuvottujen \1, \2 ... sijaan) muuttujat $1, $2...

temu92 [02.04.2009 20:06:42]

#

Kuvan mittoja ei ole pakko kertoa img-tagissa.

Kuitenkin se tehtäisiin heittämällä kuvan mitat tuonne jälkimmäiseen str_replaceen, tosin regexpit olisi tähä tietysti mitä mainioin vaihtoehto, ks. putkan Säännölliset lausekkeet PHP:ssä.

(EDIT: vois olla kans hyvä painaa välillä refresh-nappulaa, tonni vastauksia ennen mua :X)

timodemus [02.04.2009 20:10:06]

#

eg: Katsoin tuon oppaan, mutta en ymmärtänyt miten se auttaa tässä ongelmassa.
Joten olisin kiitollinen, jos joku voisi vääntää tähän koodin. Oppisin varmasti periaatteen valmista koodia lukemalla.

eq [02.04.2009 20:36:21]

#

Perl-pseudokoodi:

$str =~ s/\[img\](.+?)\[\/img\]/
        my ($width, $height) = imgsize($1);
        qq{<img alt="$1" width="$width" height="$height" src="$1">}/eg;

Eli esim.

<?php
    function make_tag($img) {
    	list($w, $h) = getimagesize($img);
    	return "<img alt=\"$img\" src=\"$img\" width=\"$w\" height=\"$h\"/>";
    }

    $str = preg_replace('/\[kuva\](.+?)\[\/kuva\]/e',
                        'make_tag("\1")',
                        $str);
?>

Ei välttämättä kaikkien taiteen sääntöjen mukainen; en ole juurikaan PHP:tä käyttänyt vuosiin.

timodemus [06.04.2009 18:57:32]

#

Sain eq:n koodin toimimaan hyvin yksinään, mutta en saa integriotua sitä muuhun koodiin. Keksin yksinkertaisemman ratkaisun, jossa teksti käsitellään rivi kerrallaan, mutta siinä on pieni bugi.

tässä omakoodi.php:

<?php
// Luetaan tiedosto taulukkoon:
$tiedosto = file("../tiedosto.txt");

// Tulostetaan rivi kerrallaan
for ($i = 0; $i < count($tiedosto); $i++) {
	$rivi = $tiedosto[$i];

	// Haetaan kuvalle mitat
	if (strstr($rivi, '[kuva]')) { // Tarkistus, sisältääkö rivi tekstin "[kuva]"
		$kuva = $rivi;
   	$kuva = str_replace('[kuva]', '', $kuva);
		$kuva = str_replace('[/kuva]', '', $kuva);
		list($width, $height, $type, $attr) = getimagesize($kuva);
		$kuva = ' <img src="' . $kuva . '" width="' . $width . '" height="' . $height . '" alt=""><br> ';
		$rivi = $kuva;
	}

	// Otsikko
	$rivi = str_replace('[ots]', '<font size="+1"><b>', $rivi);
	$rivi = str_replace('[/ots]', '</b></font><br>', $rivi);

	// Vaakaviiva
	$rivi = str_replace('[viiva]', '<hr>', $rivi);

	// Rivinvaihto
	$rivi = str_replace('[rv]', '<br>', $rivi);

	// sisällön keskittäminen
	$rivi = str_replace('[kesk]', '<p align="center" style="margin: 0px;">', $rivi);
	$rivi = str_replace('[/kesk]', '</p>', $rivi);
	echo $rivi;
	}
?>

ja tässä tiedosto.txt:

[ots]moro[/ots]
[ots]toinen otsikko[/ots]
[kesk]
keskitettyä tekstiä keskitettyä tekstiä keskitettyä tekstiä keskitettyä tekstiä
keskitettyä tekstiä keskitettyä tekstiä keskitettyä tekstiä keskitettyä tekstiä
keskitettyä tekstiä keskitettyä tekstiä keskitettyä tekstiä keskitettyä tekstiä
[/kesk]
[viiva]
[kuva]bonitonkatalat2.jpg[/kuva]

Kuva siis aina omalla rivillään.
Koodi toimii hyvin, jos kuva on tiedostossa viimeisellä rivillä, mutta jos kuvan jälkeen on sisältöä, kuvalle ei anneta mittoja ja tulee seuraavanlainen virheilmoitus:

Warning: getimagesize(bonitonkatalat2.jpg ) [function.getimagesize]: failed to open stream: Invalid argument in G:\- WEBDESIGN -\EasyPHP 3.0\www\koulu\Flatfile\montarivia\scriptit\omakoodi.php on line 14

Missä siis tein virheen?

A1A [06.04.2009 19:45:12]

#

file-funktio ei poista rivinvaihtoja, joten kuvan tiedostonimessä on kaikkialla muualla paitsi viimeisellä rivillä rivinvaihto. Korjaa tämä vaihtamalla for-silmukan ekaksi riviksi $rivi = trim($tiedosto[$i]);

timodemus [06.04.2009 20:19:43]

#

Kiitos A1A, nyt toimii!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta