Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Abi vaja PHP-s stringi manipuleerimisel märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Ramones
HV veteran
Ramones

liitunud: 09.07.2004




sõnum 18.08.2010 12:09:12 Abi vaja PHP-s stringi manipuleerimisel vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002



Online

sõnum 18.08.2010 12:24:49 vasta tsitaadiga

See peaks vist tegema mida vaja:
php:
  1. $var = '<b>'.preg_replace('/:/', ':</b>', $var, 1);

_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ramones
HV veteran
Ramones

liitunud: 09.07.2004




sõnum 18.08.2010 14:35:59 vasta tsitaadiga

Renka, suur aitäh, töötab täpselt nagu tarvis thumbs_up.gif

preg_ funktsioonid veel täielik müstika minujaoks icon_smile.gif
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 75
tagasi üles
vaata kasutaja infot saada privaatsõnum
Kilpa
HV kasutaja
Kilpa

liitunud: 10.06.2010



Autoriseeritud ID-kaardiga

sõnum 19.08.2010 10:05:45 vasta tsitaadiga

Ramones kirjutas:
Renka, suur aitäh, töötab täpselt nagu tarvis thumbs_up.gif

preg_ funktsioonid veel täielik müstika minujaoks icon_smile.gif


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:
  1. $loetelu='punkt1: teema<br>punkt2: teema<br>punkt3: teema';
  2. $loetelu=explode('<br>', $loetelu); // lõhume <br> järgi laiali
  3. $punktid=array(); // tekitame uue massiivi
  4. foreach($loetelu as $punkt)
  5.         $punktid[] = explode(':', $punkt); // lõhume punktid ära kooloni järgi.
  6.        
  7. foreach($punktid as $punkt){
  8.         print "<b>".$punkt[0].":</b>"; // prindime punkti
  9.         unset($punkt[0]); // eemaldame punkti loetelust
  10.         print join("", $punkt)."\n"; // lisame teema, igaks juhuks joinime, sest kui teema nimes oli koolon siis kuvab ikkagi korraliku pealkirja.
  11. }


//edit: väike parandus
Kommentaarid: 25 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 24
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ramones
HV veteran
Ramones

liitunud: 09.07.2004




sõnum 19.08.2010 11:12:04 vasta tsitaadiga

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 icon_smile.gif
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 75
tagasi üles
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 19.08.2010 12:00:18 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002



Online

sõnum 19.08.2010 12:08:29 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ramones
HV veteran
Ramones

liitunud: 09.07.2004




sõnum 19.08.2010 12:30:42 vasta tsitaadiga

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 thumbs_up.gif thumbs_up.gif

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
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 19.08.2010 13:31:20 vasta tsitaadiga

Ma pakuksin välja variandi
php:
  1. 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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 19.08.2010 13:44:18 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 24.08.2010 18:14:26 vasta tsitaadiga

njah minu viga, igatahes:
php:
  1.  
  2. <?php
  3. $loetelu='punkt1: tee:ma<br>punkt2: teema<br>punkt3: teema: a';
  4.  
  5. $found_hypen = false;
  6. $output     .= '<b>';
  7. $len         = strlen($loetelu);
  8.  
  9. for($i = 0; $i < $len; $i++){
  10.  if(!$found_hypen && $loetelu[$i] == ':'){
  11.   $found_hypen = true;
  12.   $output .= ':</b>';
  13.   continue;
  14.  }
  15.  
  16.  if($i < $len - 4 && $loetelu[$i] == '<'
  17.       && $loetelu[$i + 1] == 'b' && $loetelu[$i + 2] == 'r'
  18.      && $loetelu[$i + 3] == '>'){
  19.       $found_hypen = false;
  20.       $output     .= '<br><b>';
  21.       $i          += 3;
  22.       continue;
  23.  }
  24.  
  25.  $output .= $loetelu[$i];
  26. }
  27.  
  28. echo $loetelu . "\n";
  29. echo $output;

üldiselt on alati harivam/lõbusam töötada välja stringitöötlus kui kasutada olemasolevaid asju
ega ma raha pärast progejaks ei hakanud icon_lol.gif
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 26.08.2010 13:37:41 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Absona
Lõuapoolik
Lõuapoolik

liitunud: 17.09.2008




sõnum 26.08.2010 13:45:54 vasta tsitaadiga

Sellest lähtuvalt ka selline printsiip, mida tasub järgida: DTSTTCPW (do the simplest thing that could possibly work).
_________________
Veebilehed, veebiprogrammeerimine, veebilahendused
Erinevad rakendused ja skriptid.
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Abi vaja PHP-s stringi manipuleerimisel
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.