Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Ramones
HV veteran

liitunud: 09.07.2004
|
18.08.2010 12:09:12
Abi vaja PHP-s stringi manipuleerimisel |
|
|
Abi vaja PHP-s järgneva teostamisel:
On olemas loetelu kujul:
$loetelu='punkt1: teema<br>punkt2: teema<br>punkt3: teema';
Eraldasin selle muutuja massiiviks kasutades explode('<br>', $loetelu);
Hätta jäin aga järgnevaga:
Nüüd oleks vaja leida igal real esimesena esinev sümbol ":" ja kõik enne seda sümbolit (kaasaarvatud see sama sümbol) asetada <b></b> tagidesse.
Lõpuks peaks loetelu välja nägema:
punkt1: teema
punkt2: teema
jne.
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
75 |
|
tagasi üles |
|
 |
Renka
HV Guru

liitunud: 01.04.2002

|
18.08.2010 12:24:49
|
|
|
See peaks vist tegema mida vaja:
_________________ There is no place like 127.0.0.1 |
|
Kommentaarid: 71 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
1 :: |
61 |
|
tagasi üles |
|
 |
Ramones
HV veteran

liitunud: 09.07.2004
|
18.08.2010 14:35:59
|
|
|
Renka, suur aitäh, töötab täpselt nagu tarvis
preg_ funktsioonid veel täielik müstika minujaoks
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
75 |
|
tagasi üles |
|
 |
Kilpa
HV kasutaja

liitunud: 10.06.2010
|
19.08.2010 10:05:45
|
|
|
Ramones kirjutas: |
Renka, suur aitäh, töötab täpselt nagu tarvis
preg_ funktsioonid veel täielik müstika minujaoks  |
Ise olen jõudnud järeldusele, et preg funktsioonid on suhteliselt kohmakad ja tasuvad ennast ära vaid keerulisemate stringitöötluste juures. Enamasti sellised lihtsad stringitöötlused nagu siin näidatud, lahendaksin nii:
php:
|
$loetelu='punkt1: teema<br>punkt2: teema<br>punkt3: teema'; $loetelu= explode('<br>', $loetelu); // lõhume <br> järgi laiali $punktid= array(); // tekitame uue massiivi foreach($loetelu as $punkt) $punktid[] = explode(':', $punkt); // lõhume punktid ära kooloni järgi. foreach($punktid as $punkt){ print "<b>". $punkt[0]. ":</b>"; // prindime punkti unset($punkt[0]); // eemaldame punkti loetelust print join("", $punkt). "\n"; // lisame teema, igaks juhuks joinime, sest kui teema nimes oli koolon siis kuvab ikkagi korraliku pealkirja. }
|
//edit: väike parandus
|
|
Kommentaarid: 25 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
24 |
|
tagasi üles |
|
 |
Ramones
HV veteran

liitunud: 09.07.2004
|
19.08.2010 11:12:04
|
|
|
Aga kumb variant on efektiivsem? Ma kaldun arvama, et Renka poolt toodud preg_replace
Tegemist ei ole nii lihtsa stringiga kui näites toodud - muutuja $loetelu on tavaliselt sadu tähemärke pikk ja ridadeks lammutamisel koosneb enamasti rohkemast kui 15-20 reast.
Minu jaoks on muidugi teine variant vähe paremini arusaadav
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
75 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
19.08.2010 12:00:18
|
|
|
tegelikult on Kilpa antud kood kah suht ebaeffektiivne.
muidu üldiselt need erinevused on ikka väga väikesed.. ning optimiseerida tuleks hakata siis kui seda vaja on, mina muidugi eelistan preg_ funktsioone ise, kui regex mingil määral selge siis on stringitöötlusi väga luks teha, ning arvestades, et selline küsimus siis usu mind, ära üldse mõtle optimiseerimisele!
muidu probleemi ise lahendaksin nii:(kuna koodid siin antud ei võta arvesse näiteks juhtumeid 'teema: lahe:teema<br>') siis ei võta ka seda minu kood, igatahes:
kõik : asendad </b>: 'ga ning kõik <br> asendad <br><b> ning stringi algusesse paned kah <b>, sounds easy right?
echo '<b>' . str_replace(array('<br>', ':'), array('<br><b>', '</b>:'), $str);
|
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
Renka
HV Guru

liitunud: 01.04.2002

|
19.08.2010 12:08:29
|
|
|
mark11, aga teemapästituses on ju just välja toodud, et peab toimima juhtudel kus on mitu koolonit real. Ehk siis ainult esimene tuleb boldi panna.
_________________ There is no place like 127.0.0.1 |
|
Kommentaarid: 71 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
1 :: |
61 |
|
tagasi üles |
|
 |
Ramones
HV veteran

liitunud: 09.07.2004
|
19.08.2010 12:30:42
|
|
|
mark11, ma ei mõtlegi erilisele koodi optimeerimisele (ei jaga seda teemat nii sügavuti) vaid kui antud funktsiooni täidetakse kokkuvõttes ka 0.x sekundit kiiremini mõnest muust alternatiivsest lahendusest, siis on see juba võit lehe laadimise kiirusel.
Sinu pakutud variant ei sobi seetõttu, et tavaline nähtus on, kus ühel real esineb veel mõni ":" (esimese postis tõin välja ka, et leida on vaja just esimene ":").
Igatahes Renka pakutud kood töötab täpselt nagu vaja
Võite muidugi välja pakkuda veel alternatiivseid lahendusi. Ikka huvitav lugeda kuidas ühte või teist ülesannet mitut moodi lahendada.
Peab ikka mingil hetkel regulaaravaldiste tutorialid ette võtma ja asja selgeks tegema. Seni olen seda teemat vältinud.
|
|
Kommentaarid: 76 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
75 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
19.08.2010 13:31:20
|
|
|
Ma pakuksin välja variandi
php:
|
preg_replace("/([^:]+): ([^<]+)(<br>)?/", "<b>$1</b>: $2<br>", $loetelu)
|
Ise eelistan ka preg_ funktsioone muul moel stringinikeramistele.
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
19.08.2010 13:44:18
|
|
|
Ramones kirjutas: |
mark11, ma ei mõtlegi erilisele koodi optimeerimisele (ei jaga seda teemat nii sügavuti) vaid kui antud funktsiooni täidetakse kokkuvõttes ka 0.x sekundit kiiremini mõnest muust alternatiivsest lahendusest, siis on see juba võit lehe laadimise kiirusel. |
See 0.000x sekundit, mis serveri pool php töötlemises võidetakse ei paista väljagi selle kõrval, et valmis lehe üle internetitorude kliendiarvutisse liigutamine on ikkagi tegevus, millele kulub umbes 1 sekund keskeltläbi.
Seega, korrates veel üle - ära üldiselt mõtle asjade kiirusele enne, kui selleks tekib reaalne vajadus. Samuti on oluline see, et kood oleks peale vaadates arusaadav, ülioptimeeritud ja kiire kood võibolla täielikult arusaamatu ka autorile endale kuu aega hiljem.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
24.08.2010 18:14:26
|
|
|
njah minu viga, igatahes:
php:
|
<?php $loetelu='punkt1: tee:ma<br>punkt2: teema<br>punkt3: teema: a'; $found_hypen = false; $output .= '<b>'; for($i = 0; $i < $len; $i++){ if(!$found_hypen && $loetelu[$i] == ':'){ $found_hypen = true; $output .= ':</b>'; continue; } if($i < $len - 4 && $loetelu[$i] == '<' && $loetelu[$i + 1] == 'b' && $loetelu[$i + 2] == 'r' && $loetelu[$i + 3] == '>'){ $found_hypen = false; $output .= '<br><b>'; $i += 3; continue; } $output .= $loetelu[$i]; }
|
üldiselt on alati harivam/lõbusam töötada välja stringitöötlus kui kasutada olemasolevaid asju
ega ma raha pärast progejaks ei hakanud
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
26.08.2010 13:37:41
|
|
|
mark11 kirjutas: |
üldiselt on alati harivam/lõbusam töötada välja stringitöötlus kui kasutada olemasolevaid asju
|
Enda jaoks võibolla jah aga võiks ikka järgida KISS põhimõtet, siis ei pea ise ja teised poole aasta pärast kukalt kratsima.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
Absona
Lõuapoolik

liitunud: 17.09.2008
|
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
|