Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP merkkijono paloitettua tietynlaisten vakiosanojen perusteella

Sivun loppuun

carter [15.12.2009 17:56:58]

#

En oikein keksinyt miten onnistuisin saamaan merkkijonon paloiteltua tiettyjen sanojen perusteella, mitkä esiintyvät tuossa merkkijonossa. Toivottavasti joku osaa auttaa.

Esimerkiksi:

Merkkijono: koodi1­moi­koo­di2­mi­ta­koo­di3­kuu­luu­koo­di1i­han­koo­di2­hy­vaa­koo­di3­kuuluu
Eli tuossa on sanat peräkkäin:
koodi1 moi koodi2 mita koodi3 kuuluu
koodi1 ihan koodi2 hyvaa koodi3 kuuluu

-Vakiona merkkijonossa siis esiintyy seuraavat sanat: koodi1, koodi2, koodi3

Tarkoituksena olisi saada muotoiltua mahd str funktioilla ja silmukalla merkkijonosta html taulukko:

<table>
   <tr>
      <td>moi</td>
      <td>mita</td>
      <td>kuuluu</td>
   </tr>
   <tr>
      <td>ihan</td>
      <td>hyvaa</td>
      <td>kuuluu</td>
   </tr>
</table>

-Tiedetään siis että uusi "lause" alkaa koodi1 jälkeen ja päättyy, kunnes seuraava koodi1 tulee.

Tässä vaiheet, miten itse ajattelin tuon toteutettavan (en vain tiedä miten nämä tehdään PHP:lla):
-kierrätetään silmukassa niin pitkään kun merkkijonoa riittää (aina silmukan lopussa poistetaan merkkijonosta se, mikä käsiteltiin jo)

Silmukassa:
-koodi1:sta seuraavan koodi1 alkuun leikataan merkkijonosta

-koodi1:sta koodi2:een leikataan omaksi soluksi (ensimmäinen <td>)
-koodi2:sta koodi3:een laikataan omaksi soluksi (toinen <td>)
-koodi3:sta rivin loppuun leikataan omaksi soluksi (kolmas <td>)
-poistetaan merkkijonosta käsitelty rivi


Tässä hieman pähkinää purtavaksi. Toivottavasti joku osaa helppiä :)

Sami [15.12.2009 18:22:59]

#

Tuon pilkkomisen voi hoitaa helposti esimerkiksi säännöllisten lausekkeiden (regular expression, regexp) avulla.

koodi1(.*)koodi2(.*)koodi3(.*)

carter [15.12.2009 19:17:18]

#

Kiitos vinkistä :). Sain tämmöisellä toimimaan:

<?php
$etsinta1 = eregi("koodi1(.*)koodi2",$merkkijono,$tulokset1);
$etsinta2 = eregi("koodi2(.*)koodi3",$merkkijono,$tulokset2);
$etsinta3 = eregi("koodi3(.*)koodi1",$merkkijono,$tulokset3);

echo "<table>";
for($i = 0; $i < count($etsinta1); $i++) {
echo "<tr>
<td>".$tulokset1[$i]."</td>
<td>".$tulokset2[$i]."</td>
<td>".$tulokset3[$i]."</td>
</tr>";
}
echo "</table>";
?>

Tosin ongelma:
-merkkijono ei pääty "koodi1" sanaan, joten tuo $etsinta3 ei hyödytä viimeisen tiedon saamiseen. Eli merkkijonon viimeinen sana jää tuloksista pois.

Eli olisiko ehdotuksia, mitä kannattaisi muuttaa?

Sami [15.12.2009 20:10:32]

#

Pilko data riveihin.
Jokaiselle riville:
  preg_match("/koodi1(.*)koodi2(.*)koodi3(.*)/", $merkkijono, $tulokset);
  tee $tuloksille jotain.

$tulokset[0] sisältää koko sen tekstin, joka täsmäsi tuohon lausekkeeseen (eli tässä tapauksessa koko rivin), $tulokset[1-3] sisältää tekstin, joka täsmäsi sulkujen sisällä oleviin lausekkeisiin.

Lisäksi kannattaa tutustua tarkemmin säännöllisten lausekkeiden käyttöön PHP:ssä https://www.php.net/manual/en/book.pcre.php ja tietysti yleisesti muutenkin niihin säännöllisiin lausekkeisiin.

carter [15.12.2009 22:12:46]

#

Mites kun tuo antaa tulokset[1] tulosteeksi: moikoodi2mitakoodi3kuuluukoodi1ihan

Jostain syystä se ottaa viimeiseen "koodi2" asti menevän merkkijonon, eli miten saisin sen nimenomaan ottavan sen sisällön mikä ei nimenomaan sisällä "koodi1", "koodi2" tai "koodi3" tekstejä.
Olen etsiskellyt jonkin aikaa ohjetta tuohon, mutta en ole löytänyt.

Teuro [15.12.2009 22:31:03]

#

Kelpaako tällainen?

<?php
$mjono = "koodi1moikoodi2mitakoodi3kuuluukoodi1ihankoodi2hyvaakoodi3kuuluu";

$taulu = preg_split("/koodi[0-9](.*?)/", $mjono);

var_dump($taulu);
?>

carter [15.12.2009 23:22:19]

#

noniin, kiitoksia :)
nyt toimii juuri niin kuin pitääkin.

<?php
echo "<table><tr>";
$tulokset = preg_split("/koodi[0-9](.*?)/", $merkkijono);
for($i = 1; $i <= count($tulokset); $i++){
echo "<td>".$tulokset[$i]."</td>";
if(is_int($i/3)) echo "</tr><tr>";
}
echo "</tr></table>";
?>

Metabolix [16.12.2009 08:20:55]

#

Mitähän varten Teuron esimerkissä on tuo "(.*?)", kun se ei kuitenkaan poimi yhtään merkkiä?

Teuro [16.12.2009 09:28:00]

#

Ajatuskatkos luultavamminkin :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta