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">
$teksti = str_replace("[kuva]", "<img src=\"", $teksti); $teksti = str_replace("[/kuva]", "\" width=\"" . $width . "\" height=\"" . $height . "\">", $teksti);
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]
Jotta voit selvittää kuvan koon getimagesize
n 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...
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)
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.
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.
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?
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]);
Kiitos A1A, nyt toimii!
Aihe on jo aika vanha, joten et voi enää vastata siihen.