[ mrax @ 12.06.2006. 22:12 ] @
Htio bih napraviti kod kojim ću napisanu rečenicu u textboxu razdjeliti na riječi.
Šaljem code koji razdvaja prvu i drugu riječ i ispisuje ih na zaslonu.
problem je što mi u WHILE petlja odradi samo 2 kruga umjestoda stane tek kada prnađe razmak " ".

U ovom slučaju pošaljem rečenicu : 12345 6789 ABCD / treću riječ sam stavio da nađe drugi razmak
na ekranu umjesto da ispiše:
12345

6789

dobijem ispis:
12

4

evo koda, gdje grešim?
<?php $niz=$_POST['niz'];/* IZVLAČI IZ TEXT BOKSA NIZ I PUNI $niz */
$x=1 ;
$none=" " ;
while (substr($niz,$x)==$none); /* POČETAK TRAŽENJA PRVE RIJEČI */
{
$x++ ;
}
$rijec1=substr($niz,0,$x) ; /* KRAJ TRAŽENJA PRVE RIJEČI */

$A=$x+1 ; /* ODREĐUJE DA SE DRUGA RJEČ TRAŽI OD PRVOG RAZMAKA*/
/* POČETAK TRAŽENJA DRUGE RJEČI */
while (substr($niz,$A)==$none); /* KADSA JE $A ==" " ONDA DRUGA RJEČ IDE OD $X+1 DO $A */
{
$A++ ;
}
$C=$x+1 ; /* DRUGA RJEC POČINJE OD RAZMAKA + 1 POLJE */
$D=$A-$C ; /* ODUZMI GDJE JE DRUGI RAZMAK OD POČETKA DRUGE RJEČI */
$rijec2= substr($niz,$C,$D) ; /* RJEC2 IDE OD POZICIJE $C A DULJINA JE $D */
echo ($rijec1) ;
?>
<p>
<?php
echo ($rijec2) ;
?>
[ kelja @ 12.06.2006. 22:58 ] @
A zasto bi komplikovao?Ovo je mnogo jednostavnije resenje:
Code:

$recenica="Mozda je ovo mnogo jednostavniji nacin?A mozda i nije!A ipak jeste.DA.";
$recenica=str_replace("?"," ",$recenica);
$recenica=str_replace("."," ",$recenica);
$recenica=str_replace("!"," ",$recenica);
$niz=explode(" ","$recenica");
foreach($niz as $element)
if($element<>"")
echo "$element<br>";

Dodao sam neke stvari...Prvi kod je dobro radio,ali sa jednom recenicom...Ovo bi trebalo da radi i sa vise;-)



[Ovu poruku je menjao kelja dana 13.06.2006. u 06:56 GMT+1]
[ sojic @ 12.06.2006. 23:01 ] @
Dali mora da koristis while petlu?

Ja bih to izveo sa split funkciju.

Nemam PHP pri ruci, ali to bi izgledalo ovako

Code:


$niz="asdf lkj werw dsfg";
$reci = split(" ", $niz);

foreach ($reci as $rec) {
   echo $rec;
}


nisam siguran za ovaj split dali ce da splituje prazan prostor ili treba split(" \ ", $niz).
[ cartmanlee @ 13.06.2006. 07:33 ] @
Da nadopunim primjer od @sojica:
Code:


$niz="asdf lkj werw dsfg.sdfsdfsdf!asdasda?";
$reci = split("[.?! ]", $niz);

foreach ($reci as $rec) {
   echo $rec;
}


Na ovaj način će se string lomiti kada naiđeš i na kraj rečenice. Jedino bi možda mogao nastati problem kada imaš .... ili ????. Nisam isprobao stvar, ali ako bude problem, možeš to napraviti kao:

Code:


$niz="asdf lkj werw dsfg.sdfsdfsdf!asdasda?";
$reci = split("[.?! ]", $niz);

foreach ($reci as $rec) {
   
   if (trim($rec) != "") echo $rec;
}


Na taj način ćeš izbaciti prazne stringove.

BTW, PHP manual mi je na desktopu, ali je rano jutro i ne da mi se isprobati primjer
[ Br@nkoR @ 13.06.2006. 07:48 ] @
Code:

$recenica = 'akdsjfl....    sldf: sldkg, sgk! sagkfotiore;
dasf sda??? sd fsdag sg a';
$reci1 = split('[[:space:][:punct:]]+', $recenica);
echo '<pre>'.print_r($reci1, true).'</pre>';
/* ili */
$reci2 = preg_split('/[\s\p{P}]+/', $recenica);
echo '<pre>'.print_r($reci2, true).'</pre>';



[Ovu poruku je menjao Br@nkoR dana 13.06.2006. u 09:00 GMT+1]
[ mrax @ 13.06.2006. 11:57 ] @
Citat:
Br@nkoR
Code:

$recenica = 'akdsjfl....sldf: sldkg, sgk! sagkfotiore;
dasf sda??? sd fsdag sg a';
$reci1 = split('[[:space:][:punct:]]+', $recenica);
echo '<pre>'.print_r($reci1, true).'</pre>';
/* ili */
$reci2 = preg_split('/[\s\p{P}]+/', $recenica);
echo '<pre>'.print_r($reci2, true).'</pre>';



[Ovu poruku je menjao Br@nkoR dana 13.06.2006. u 09:00 GMT+1]

Cekaj, nije mi najasnija forma ovde.?
Ako nije problem možeš mi objasniti red po red što php radi u ovom slučaju. Moram kod uklopiti u malo veći pa moram znati namraviti modifikaciju.
[ mrax @ 13.06.2006. 12:08 ] @
Citat:
kelja: A zasto bi komplikovao?Ovo je mnogo jednostavnije resenje:
Code:

$recenica="Mozda je ovo mnogo jednostavniji nacin?A mozda i nije!A ipak jeste.DA.";
$recenica=str_replace("?"," ",$recenica);
$recenica=str_replace("."," ",$recenica);
$recenica=str_replace("!"," ",$recenica);
$niz=explode(" ","$recenica");
foreach($niz as $element)
if($element<>"")
echo "$element<br>";

Dodao sam neke stvari...Prvi kod je dobro radio,ali sa jednom recenicom...Ovo bi trebalo da radi i sa vise;-)



[Ovu poruku je menjao kelja dana 13.06.2006. u 06:56 GMT+1]

Ne mioram koristiti while petlju.
ali kako mi ovde php razdvoji reči i doda ih promjenjivima:

$rečenica="Mozda je ovo mnogo jednostavniji nacin?A mozda i nije!A ipak jeste.DA.";
$reč1="Možda"
$reč2="je"
$reč3="ovo"
$reč4="mnogo"
...........
[ Br@nkoR @ 13.06.2006. 13:31 ] @
Citat:
mrax: Cekaj, nije mi najasnija forma ovde.?
Ako nije problem možeš mi objasniti red po red što php radi u ovom slučaju. Moram kod uklopiti u malo veći pa moram znati namraviti modifikaciju.

Dakle postavio sam dva načina upotrebom regularnih izraza, upotrebom POSIX i PCRE(Perl) sintakse. To su funkcije split i preg_split.
Obe rade isto, dakle ukoliko proslediš neki sting oni će razdvojiti(podeliti) string na mestima gde se nalaze praznine( ,\r,\n,\t) ili interpunkcijski znaci, pri tom na tom mestu može imati najmanje jedan od znakova, i pri tom je moguća kombinacija praznina i interpukcijskih znakova (npr. " .", ".", ".,.", "?? !" itd.). Za malo bolje objašnjenje najbolje je da pogledaš manual, gde imaš detaljnije objašnjenu upotrebu regularnih izraza.

Pri ovom kodu dobijaš dva niza $reci1 (upotrebom POSIX-a) i $reci2 (upotrebom PCRE-a).

Funkcije echo i print_r sam koristio samo da prikažem ta dva niza.

Promenljiva $recenica je test string, kojim sam testirao ove funkcije.

Ti možeš, ukoliko ti odgovaraju ove funkcije, da koristiš jednu od bilo koje.

Nadam se da je sada malo jasnije.
[ Br@nkoR @ 13.06.2006. 13:55 ] @
Nešto sam zaboravio da postavim u funkciji preg_split, a to je konstanta PREG_SPLIT_NO_EMPTY kako se ne bi vratili prazni delovi.
[ kelja @ 14.06.2006. 00:25 ] @
Evo nesto sredjenijeg ispisa:(a i malo boljeg koda koji uzima u obzir razne korisnicke nestasluke,a sigurno sam nesto i zaboravio)
Code:

<html>
<head>
<title>REC PO REC</title>
</head>
<body>
<form action="reci.php" method="post">
<textarea rows=5 cols=20 wrap="off" name="recenice" value=""></textarea><br><br>
<input type="submit" value="Ispisi" name="Ispisi"></form>
<?php
if(isset($_POST['Ispisi'])){

$nezeljenikarakteri=array("?","!",".",",","\n","\r","\t",";","-","/","\\","<",">");
for($i=0;$i<count($nezeljenikarakteri);$i++)
{
$recenice=str_replace("$nezeljenikarakteri[$i]"," ",$recenice);
}
$rec=array();
$reci=explode(" ","$recenice");
foreach($reci as $element) {
if($element<>""&& $element<>" ")
array_push($rec,$element);
//echo "$element<br>";
}
while (list($index,$vrednost)=each($rec)) {

$broj=$index+1;
$varijabla="REC$broj";

echo "$varijabla=$vrednost<br>";
}
}
?>
</body>
</html>


U sustini,preporucujem ti Brankovo resenje-mnogo je krace i efikasnije...
P.S.Reci su razdvojene i elementi su niza $rec, a i ispis je uredniji.
P.S.2-PhP znalci,ne smejte se!!!;-)
[ mrax @ 14.06.2006. 02:36 ] @
Code:

<?php $niz=$_POST['niz'];/* IZVLAČI IZ TEXT BOKSA NIZ I PUNI $niz */
$reci = split("[.?!, ]", $niz);

foreach ($reci as $rec) {
   
   if (trim($rec) != "") echo $rec;
}
echo ($reci[0]);
?>
  

          <p>
<?php
echo ($reci[1]);
?>
</p>
          <p>
  <?php
echo ($reci[2]);
?>
  </p>
          <p>
  <?php
echo ($reci[3]);
?>

Ovo je primer od Sojica i kojeg je nadopunio cartmanlee .Dodao sam samo ","
Evo rezultata:
Pošaljem php-u rečenicu : Ovo je probni primjer!
dobijem sledeći rezultat.
____________________
OvojeprobniprimjerOvo - echo ($reci[0]);- ovde nastaje problem???Tu treba pisati "Ovo"

je - echo ($reci[1]);

probni - echo ($reci[2]);

primjer -echo ($reci[3]);
____________________

mislim da je rešenje blizu
BTW : Kako da u dreamweweru napišem [ ] "ctrl+alt+F mi otvara select file ekran
[ cartmanlee @ 14.06.2006. 06:52 ] @
AltGr+f ?
[ Br@nkoR @ 14.06.2006. 07:31 ] @
Citat:
mrax
OvojeprobniprimjerOvo - echo ($reci[0]);- ovde nastaje problem???Tu treba pisati "Ovo"

Pa i piše, za echo $rec[0] štampa se "Ovo". Proveri ponovo.
[ Br@nkoR @ 14.06.2006. 08:50 ] @
Citat:
kelja: Evo nesto sredjenijeg ispisa:(a i malo boljeg koda koji uzima u obzir razne korisnicke nestasluke,a sigurno sam nesto i zaboravio)

Možda je u tom slučaju, bolje proći kroz string i izvući samo reči , odnosno samo delove koji sadrže slova, da ne bi brinuli koje će korisnik znakova/simbole uneti. Nešto npr:
Code:

preg_match_all('/\w+/s', $recenica, $reci);
[ mrax @ 14.06.2006. 10:26 ] @
Citat:
Br@nkoR: Pa i piše, za echo $rec[0] štampa se "Ovo". Proveri ponovo.

ma nisam razdvoio prva dva echo
mislim da ce sada biti dobro.
[ mrax @ 14.06.2006. 11:33 ] @
Sad je u redu, samo sada trebam na kraju rečenice utvrditi jeli rečenica upitna, usklična izjavna ili slično?
Dali moram koristiti substr funkciju i while ili i za ovo postoji elegantnije rešenje?
Code:

$n=1;
while (Substr($niz,0,$n)=="?");
{
$n++ ;
echo ('rečenica je upitna');
}


ovo je najprostiji primjer. treba mi puno složenije rješenje.
Preciznije, kod mi mora rečenicu gramatički obraditi.
Stoga moram imati izvučene u $rec[ ] sve delove rečenice.
(I točke i zareze i Upitnike )
U dosadašnjem kodu mi ih samo isključi.
[ kelja @ 14.06.2006. 14:38 ] @
Citat:
Br@nkoR: Možda je u tom slučaju, bolje proći kroz string i izvući samo reči , odnosno samo delove koji sadrže slova, da ne bi brinuli koje će korisnik znakova/simbole uneti. Nešto npr:
Code:

preg_match_all('/\w+/s', $recenica, $reci);

Pa naravno,ali ja bas i nisam vest u koriscenju regularnih izraza(sto se i vidi;-)...Hvala,Branko.
Citat:
mrax: Sad je u redu, samo sada trebam na kraju rečenice utvrditi jeli rečenica upitna, usklična izjavna ili slično?

Preciznije, kod mi mora rečenicu gramatički obraditi.
Stoga moram imati izvučene u $rec[ ] sve delove rečenice.
(I točke i zareze i Upitnike )
U dosadašnjem kodu mi ih samo isključi.

Sad si me zainteresovao...kakva tebi aplikacija zapravo treba?Sta podrazumevas pod'gramatickom obradom'recenice?Utvrdjivanje komunikativne funkcije recenica tesko se moze uraditi na osnovu interpunkcijskog znaka na kraju.Recimo,uzvicnik moze da se nalazi i na kraju uzvicne recenice,a i na kraju zeljne,ili pak zapovedne...E da,koliko recenica treba da bude obradjeno?Znaci,koliko recenica se unosi u text box???