Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: substr

carter [28.02.2009 21:28:29]

#

Jos on esimerkiksi kyseinen merkkijono: starttekstiäend (eli alussa "start", sitten "tekstiä", lopuksi "end", ja nuo ovat siis yhteen pötköön, sekä noita merkkijonoja on peräkkäin useampia)

-"start" ja "end1" sanat tiedetään, pituus tiedetään, numero "end" sanan perässä on jokaisessa "end" sanassa eri; siis 1,2,3,4...
-"tekstiä" = voi olla tekstiä, ei sisällä start/end sanoja, pituutta ei tiedetä

Tarkoituksena olisi tulostaa tuo "tekstiä" merkkijonosta. Tiedossa on siis "tekstiä" jälkeen tuleva "end", sekä sen numero: "end{$numero}" ja tietenkin tuo "start" sana ennen "tekstiä".
Tuo ei siis onnistu näin:

$numero = "1"; //numero, jonka perusteella oikea "end" loppu etsitään
$kohta = strpos($merkkijono, "end{$numero}");
$teksti = substr($merkkijono, $kohta, -x); //x olisi tekstin pituus, mutta sitä ei tiedetä, joten tämä koodi on turha

Tämä kuulostaa erittäin tyhmältä kysymykseltä, mutta joku varmaan voisi neuvoa ystävällisesti miten tuon ratkaiseminen mahdollisesti onnistuisi. Ratkaisu voisi olla esimerkiksi jokin sellainen joka käyttäisi tuota "start" sanaa hyväksi, eli hakisi tekstiä "end" sanasta lähtien vasemmalle niin kauan kunnes tulee "start" sana vastaan.

Antti Laaksonen [28.02.2009 21:38:48]

#

Olet oikeilla jäljillä. Tässä on yksi ratkaisu:

<?php
$teksti = "abcstartapinaend1abcstartbanaaniend2abcstartcembaloend3abc";

$alku = "start";
$loppu = "end2";

$tulos = substr($teksti, 0, strpos($teksti, $loppu));
$tulos = substr($tulos, strrpos($tulos, $alku) + strlen($alku));

echo $tulos;
?>

Keksiikö joku, kuinka tämän voisi tehdä säännöllisellä lausekkeella?

carter [28.02.2009 21:57:38]

#

Kiitos! :)

peg [01.03.2009 09:33:03]

#

Jos ymmärsin oikein kysymyksen, niin

STRSTR ja STRREV - alku jää pois ja esimerkki tulostaa haettujen sanojen välisen merkkijonon ja loppu jää pois.

<?php
$teksti = "STRSTR ja STRREV - alku jää pois ja esimerkki tulostaa haettujen sanojen välisen merkkijonon ja loppu jää pois.<br>";
echo $teksti;
$alku = "alku";
$loppu = strrev("jonon");
$teksti = strstr($teksti, $alku);
echo strrev(strstr(strrev($teksti),$loppu) );
?>

Esimerkki tulostaa siis:
alku jää pois ja esimerkki tulostaa haettujen sanojen välisen merkkijonon

TsaTsaTsaa [01.03.2009 11:35:06]

#

Jos ymmärsin oikein, niin peg ymmärsi väärin.

Metabolix [01.03.2009 12:09:36]

#

Antti Laaksonen kirjoitti:

Keksiikö joku, kuinka tämän voisi tehdä säännöllisellä lausekkeella?

Kelpaisiko tämä?

<?php
$teksti = "abcstartapinaend1abcstartbanaaniend2abcstartcembaloend3abc";
preg_match_all('/start(.*?)end(\d+)/', $teksti, $taulu, PREG_SET_ORDER);

$palat = array();
foreach ($taulu as $osuma) {
  $palat[$osuma[2]] = $osuma[1];
}
var_dump($taulu);
var_dump($palat); // array(1 => "apina", 2 => "banaani", 3 => "cembalo");
?>

Vastaus

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

Tietoa sivustosta