En oikein keksinyt miten onnistuisin saamaan merkkijonon paloiteltua tiettyjen sanojen perusteella, mitkä esiintyvät tuossa merkkijonossa. Toivottavasti joku osaa auttaa.
Esimerkiksi:
Merkkijono: koodi1moikoodi2mitakoodi3kuuluukoodi1ihankoodi2hyvaakoodi3kuuluu
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ä :)
Tuon pilkkomisen voi hoitaa helposti esimerkiksi säännöllisten lausekkeiden (regular expression, regexp) avulla.
koodi1(.*)koodi2(.*)koodi3(.*)
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?
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.
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.
Kelpaako tällainen?
<?php $mjono = "koodi1moikoodi2mitakoodi3kuuluukoodi1ihankoodi2hyvaakoodi3kuuluu"; $taulu = preg_split("/koodi[0-9](.*?)/", $mjono); var_dump($taulu); ?>
noniin, kiitoksia :)
nyt toimii juuri niin kuin pitääkin.
Mitähän varten Teuron esimerkissä on tuo "(.*?)", kun se ei kuitenkaan poimi yhtään merkkiä?
Ajatuskatkos luultavamminkin :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.