Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Sivun title ja str_replace-ongelma

Tediarp [27.08.2009 23:56:18]

#

Olen tässä pari päivää tapellut ä-kirjaimen kanssa, jota olen yrittänyt saada sivun titleen, enkä oikein keksi, mikä on vikana. Eli käytän sivustollani index.php-pohjaa, johon sitten haetaan sisältö. Kyseisessä pohjassa title määräytyy siis sivun osoitteen mukaan.

Sivun alussa on seuraavanlainen koodi:

<?php header('Content-type: text/html; charset=utf-8');
    $section = $_GET[section];
    $page = $_GET[page];
	$subpage = $_GET[subpage];
	$subpagename = str_replace("_", " ", $subpage);
	$subpagename = str_replace("%C4", "ä", $subpagename);
    if (is_null($section)) {
    $section = "Home"; }
?>

Title määräytyy seuraavan mukaan (seuraava koodi on siis title-tagien sisällä)

Northern Seer - Official Site
    <?php
	if (is_null($section))
	echo("");
	else
	echo(" :: ".$section);
	if (is_null($page))
	echo("");
	else
	echo (" :: ".$page);
	if (is_null($subpage))
	echo("");
	else
	echo(" :: ".$subpagename);
    ?>

Ja sisältö includetaan sitten seuraavanlaisesti:

<?php
	  if (!preg_match("/^[a-zA-Z0-9_]+$/", $section)) {
	  exit("URL-Parameter you entered isn't correct!"); }
	  if (file_exists("contentpages/".$section."#".$page."#".$subpage.".php")) {
      include("contentpages/".$section."#".$page."#".$subpage.".php"); }
	  else {
      exit("URL you entered doesn't exist!"); }
      ?>

Kaikki näkyy ja toimii erittäin hienosti, paitsi sivu, jonka titlessä pitäisi olla ä. Kyseisen sivun suhteellinen osoite on "index.php?section=Band&amp;page=Members&amp;subpage=Okko_J%C4rvinen" ja haettavan tiedoston nimi on "Band#Members#Okko_Järvinen.php". Mutta silti titlessä näkyy ä:n paikalla vain pelkkä neliö. Missä ongelma?

Sivut ovat koodattuina UTF-8 (ilman BOMia) ja UNIX-muotoon. Ja olen php:n ja meta-tiedon lisäksi ilmoittanut myös .htaccess-tiedostossa sivujen olevan UTF-8 -koodattuja, joten selainten pitäisi ainakin käsittää se :D

Olen erittäin kiitollinen avusta.

ps. Subpagename-muuttuja osaa kyllä ottaa tiedostonimessä esiintyvän _ -merkin pois sivun titlestä, joten siltä osin kaiken pitäisi olla kunnossa.

EDIT: Sattui mieleen heräämään vielä kysymys tuosta-titlessä näkyvän tekstin määrittämisestä. Muokkasin koodia siis jonkunverran alkuperäisestä, ja epäilen tuon koodin järkevyyttä. Siis kyllähän tuo toimii, mutta nojoo... sen voisi kai kirjoittaa jotenkin helpommin/järkävämmin, kun nyt on jokaisen muuttujan kirjottaminen titleen määritetty erikseen.

Metabolix [28.08.2009 00:20:02]

#

Juttuhan on siinä, että URLissa oleva %C4 on PHP:n puolella jo valmiiksi dekoodattu kyseiseksi merkiksi (chr(0xc4)), joka on ISO-8859-1-merkistön iso Ä-kirjain. Korvaa siis str_replacella %C4:n sijaan chr(0xc4). Järkevämpi vaihtoehto tietenkin olisi käyttää iconv-funktiota täyteen UTF-8-muunnokseen, ja vielä paljon parempi olisi alusta asti saada linkkiin UTF-8:n tavuja vastaava versio %C3%84 (Ä) tai %C3%A4 (ä), jolloin mitään muunnosta ei tarvittaisi. Vielä yksi hyvä vaihtoehto mahtuu mukaan, nimittäin ääkkösten täyskielto ja pysyminen 7-bittisessä ASCII-merkistössä (nimissä ja osoitteissa, ei tietenkään sisällössä).

Tediarp [28.08.2009 00:32:04]

#

Hmmmh, kokeilin heittää sinne str_replaceen ja siis osoitteeseen myös (näin ymmärsin?) %C4:n tilalle chr(0xc4) ja kyllähän se toimi, kiitoksia =)
Linkistä tulee nyt siis tämän näköinen: "index.php?section=Band&page=Members&subpage­=Okko_Jchr%280xc4%29rvinen". Näinhän sen pitikin mennä, eikö vain?

Jäi kuitenkin nuo järkevämmiksi sanomasi vaihtoehdot mietityttämään. Noita ä:n url-merkkejä olen koittanut heittää jo linkeiksi, mutta en ole jostain syystä onnistunut, joten hylkäsin idean niiden käyttämisestä. Mutta tuo iconv-funktio jäi hämäämään, Mitä se siis oikein tekee?

peg [28.08.2009 08:10:09]

#

Yhdyn Metabolixiin -

Metabpolix kirjoitti:

ääkkösten täyskielto ja pysyminen 7-bittisessä ASCII-merkistössä (nimissä ja osoitteissa, ei tietenkään sisällössä).

Ulkolaisilla näppiksillä käyttäjä ei välttämättä edes tiedä miten Ä tai Ö
saadaan osoiteriville.

Metabolix [28.08.2009 11:45:04]

#

Tediarp kirjoitti:

Näinhän sen pitikin mennä, eikö vain?

Ei alkuunkaan. Olisit voinut tässä soveltaa itsenäistä tiedonhankintaa.

urldecode("%C4") == chr(0xc4), eli osoitteen "J%C4rvinen" on PHP:ssä "J".chr(0xc4)."rvinen", ja oikea korvaus on str_replace(chr(0xc4), "ä", ...);

Kuten sanoin, tämä on vaihtoehdoista huonoin, varsinainen purkkaratkaisu.

Myös iconv-funktiosta kerrotaan PHP:n manuaalissa.

Tediarp [28.08.2009 23:18:47]

#

Jahas, tajusin siis aivan väärin. Korjasin sen koodin oikein ja nyt pitäisi toimia. Voisin lueskella tuota php:n manuaalia, jotta selviäisi vähän enemmän php:n perusta. Tajuisinkin jotain asioista, joita käsittelen.

Mutta tyydyn tähän purkkaratkaisuun, koska kuitenkin koko sivustosta vain yksi sivu käsittää ä:n url:ssä. Sekin ä on vain eräässä nimessä, joka ei luultavasti esiinny muitten sivujen url:ssä/titlessä.

Vastaus

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

Tietoa sivustosta