[ gzox @ 06.12.2004. 09:30 ] @
Zelim da napravim niz od jednog stringa. String sadrzi skup reci i pojmova koji su razdvojeni uglavnom razmacima. Izdvajanje reci i smestanje u niz se lako radi kada se koristi split(). Na primer string je recenica:

Uredjaj marke "Red Star" ima podrsku za "quick pack" sistem.

Medjutim, problem je kod izdvajanja pojmova, zato sto se pojam sastoji od vise reci (npr. dve) koje stoje izmedju navodnika. Sto je najgore izmedju tih reci se pojavljuje razmak, koji onemogucuje upotrebu split() funkcije pomocu razmaka.

Da li postoji jednostavno i brzo resenje, ili bar neko elegantno, pomocu kojeg bi reci bile splitovane, a uz to da pojmovi koji su izmedju navodnika budu tretitrani kao jedna rec?

Odnosno, da li postoji elegantan nacin da se izdvoje reci koje su izmedju navodnika u ovom primeru koji sam naveo crvenim slovima?

Nadam se da sam bio jasan.

Unapred hvala.
[ Not now, John! @ 06.12.2004. 09:40 ] @
Pomoću funkcije preg_replace().
[ gzox @ 06.12.2004. 10:28 ] @
Da li je moguce pomocu te funkcije ovo uraditi u jednom koraku:

- Splitovati reci sa razmakom
- a pri tome reci izmedju navodnika uzimati kao jednu rec
- plus da splitovani pojmovi da ne sadrze karaktere navidnika?
[ Zoran Rašković @ 06.12.2004. 10:47 ] @
Evo nešto na brzaka, mada ne koristi Regexp:

Code:

<?php

$string = 'Uredjaj marke "Red Star" ima podrsku za "quick pack" sistem.';

$final = split(" ", $string);

$novi = array();
$j = 0;
$temp = '';

for ($i=0; $i<count($final); $i++) {

    if (substr($final[$i], 0, 1) == '"') {
        $temp = $final[$i];
    }
    if (substr($final[$i], -1) == '"') {
        $novi[$j] = substr($temp, 1) . ' ' . substr($final[$i], 0, -1);
        $j++;
    }
    if (substr($final[$i], -1) != '"' AND substr($final[$i], 0, 1) != '"') {
        $novi[$j] = $final[$i];
        $j++;
    }
}

print_r($novi);

?>


Kontam da postoji kraće i lepše rešenje.
[ gzox @ 06.12.2004. 12:26 ] @
Hvala lepo! Volio bih da vidim ono krace resenje!
[ marinz @ 08.12.2004. 17:41 ] @
sa regexp stringom

Code:
(?:["|'])([\s\w])+(?:["|'])


mores vaditi riječi unutar jednostrukih ili dvostrukih navodnika bez obzira na duzinu ili broj razmaka.

za ostalo pogledaj php funkciju 'preg_match_all'

a za testiranje mores koristiti odlicne programcice sa


Code:
h**p://ezshare.de/files-en/139367/pg_rb.zip.html


ako ih nema javi pa cu ih staviti :)
[ gzox @ 10.12.2004. 09:44 ] @
Hvala puno, ali kako da ubacim jos da mi se reci splituju i pomocu zareza?
[ Calimero-dev @ 22.12.2004. 01:09 ] @
Evo kako bi ja to odradio :


Odredio sta prvo mora da se izvdvoji iz ovog stringa ( u ovom slucaju prvo moras iseci deo u navodnicima, pa tek onda preostale reci odvojene zarezima ).


Nulta akcija - izbroj broj reci u polju, objasnicu kasnije zasto ovo


Prvo bih pronasao prvo pojavljivanje znaka " - navodnika, onda prvo sledece ( nemoj poslednje jer mozda bude 20-ak navodnika izmedju, vec prvo sledece pojavljivanje ) - kreirao bih substring i kompletno izbacio isti iz stringa ( naravno i zapamtio ga sa strane, zajedno sa rednim brojem prve reci u navodnicima u odnosu na ceo string.


E sad bih razbio string na zareze i kreirao array, ali u FOR petlji, da bih sa rednim brojevima sad samostalnih reci i reci koje smo uzeli iz navodnika rekonstruisao niz sa istim redosledom reci ( indexnim brojevima ) kao i u originalnom stringu.


Dobices Array sa kojim mozes dalje da se igras


NAPOMENA: kod sigurno moze jednostavnije da se napise ( oko ovog rekonstruisanja originalnog redosleda, ali posto je sad 2.06 ujutru i ja vizuelisem kodove u glavi.... )


funkcije koje treba da koristis ( a naci ces referencu na php.net) su: substr(), prem_match(), explode(), for() .... zavisno koliko ces usloznjavati obradu stringa )


Ako je ovo pomoglo, bilo mi je drago.


Pozdrav.
[ svukas @ 22.12.2004. 14:33 ] @
Citat:
gzox: Da li je moguce pomocu te funkcije ovo uraditi u jednom koraku:

- Splitovati reci sa razmakom
- a pri tome reci izmedju navodnika uzimati kao jednu rec
- plus da splitovani pojmovi da ne sadrze karaktere navidnika?


bez regularnih izraza mozes ovako:

1. splituj s navodnikom
2. neparne (ili parne ako je prvi znak bio navodnik) splitujes pomocu razmaka
3. spojis liste u odgovarajucem redosledu
[ marinz @ 26.12.2004. 18:30 ] @
probaj iz regexp-a direktno pozivati funkciju i napraviti ono sto ti treba

Code:
...
//$patt hvata stringove sa navodnicima
//kada se izvrsi preg_replace i ako nesto uhvati onda zbog one oznake "e" na kraju
//ponudi php-u rezultate po redoslijedu postavljanja () zagrada.

//$1 je prvi navodnik (jedno ili dvostruki)
//$2 je cijeli tekst unutar navodnika
//$3 je zavrsni navodnik

//preg_replace umjesto da direktno zamjeni nesto u pronadjenom dijelu stringa
//izvrsi vrijednost variable $repla tj pozove funkciju. Funkcijom mozes sa 
//array_push recimo filati neki array sa onim unutar zagrade za kasniju obradu ili ako
// napravis 'return $nesto;' onda sa tim $nesto radis zamjenu u stringu $neki_string.

$patt="/(?:["|'])([\\s\\w])+(?:["|'])/e",

$repla="replfn('$2')";

$result=preg_replace($patt,$repla,$neki_string);

function replfn($in_text){
//split $in_text ili sta ti vec treba
...
}