Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Wyświelaj od znaku do znaku
JPCannon
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 22.05.2013

Ostrzeżenie: (0%)
-----


Mam kolejny problem smile.gif Mianowicie program działa tak, że analizuje znak po znaku w stringu i w zależności od niego wykonuje dodatkowe operacje. Mam jednak problem. W owym stringu są też operacje na spacjach pomiędzy wyrazami. Problem w tym, że chciałbym by jeśli dany fragment jest w cudzysłowiu to żeby wyświetlał go normalnie i olał znaki wewnątrz. np.

Normalnie: $str='Ala "baba dada"'

efekt aktualny:
Ala
baba
dada

Chciałbym by działało tak:
Ala
baba dada

Ten post edytował JPCannon 31.05.2013, 07:56:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
!*!
post
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


  1. preg_match('/([A-Za-z]+)\s\"([a-z\s]+)\"/', $str, $match)

pisane z palca, ale mniej więcej tak to powinno być.

Ten post edytował !*! 31.05.2013, 08:25:29


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
JPCannon
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 22.05.2013

Ostrzeżenie: (0%)
-----


Niestety jak zwykle mam problem z angielskim tłumaczeniem działania funkcji. Zmienna $mathes powinna być jakoś zadeklarowana albo zamieniona na jakąś wartość?

Niestety nie działa jeśli dam w ten sposób:

<?php
$str='Ala "baba dada"';
$tablica= str_split($str);
$n=strlen($str);


for($i=0;$i<$n;$i++){
preg_match('/([A-Za-z]+)\s\"([a-z\s]+)\"/', $str, $match);
echo $tablica[$i];

if($tablica[$i]==" "){
echo ("</br>");
}
}
?>

Nadal rozdziela normalnie po spacjach. Jakieś rady?

Ten post edytował JPCannon 31.05.2013, 09:36:44
Go to the top of the page
+Quote Post
Arcioch
post
Post #4





Grupa: Zarejestrowani
Postów: 324
Pomógł: 110
Dołączył: 18.09.2012

Ostrzeżenie: (0%)
-----


Gdzie tutaj masz zmienna $mathes smile.gif

  1. <?php
  2.  
  3. $str='Ala "baba dada"';
  4. preg_match('/([A-Za-z]+)\s\"([a-z\s]+)\"/', $str, $match);
  5.  
  6. print_r($match);
  7.  
  8. ?>


Pierwszy i drugi element tablicy $match to Twoje wyciągnięte elementy smile.gif

Lub mnie poprawnie ale efekt uzyskasz (nie umiem wyrażeń regularnych ;/ )

  1. <?php
  2.  
  3. $str = 'Ala "baba dada"';
  4.  
  5. $str = str_replace('"', '', $str);
  6.  
  7. $ex = explode(' ', $str);
  8.  
  9. foreach($ex as $e)
  10. echo $e.'<br />';
  11.  
  12. ?>


Ten post edytował Arcioch 31.05.2013, 09:45:53
Go to the top of the page
+Quote Post
JPCannon
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 22.05.2013

Ostrzeżenie: (0%)
-----


Pomyliłem się w nazwie wink.gif Niestety nawet jak skopiowałem kod to jedyne co się zmieniło to brak wyświetlania ". Poza tym nadal rozdziela string po spacjach. Mi zaś zależy by rozdzielał string po spacjach ale tylko poza cudzysłowem. Zdania w cudzysłowiu chciałbym aby były wyświetlane w całości.

PS. Z tego co wyczytałem z kodu powyżej to zamieniłeś " na znak pusty i kazałeś podzielić zdanie po odstępach pomiędzy słowami. Tak więc jak pisałem nie jest to ani trochę to o co mi chodziło wink.gif Ma traktować odstęp pomiędzy wyrazami w cudzysłowiach jako wyjątek i ich nie rozdzielać.

Ten post edytował JPCannon 31.05.2013, 10:43:09
Go to the top of the page
+Quote Post
-Gość-
post
Post #6





Goście







  1. $str = 'ala "baba dada" jeden dwa trzy';
  2.  
  3. for($i=0;$i<strlen($str);$i++)
  4. {
  5. if ($str[$i]==' ' && $first==0) $first=1;
  6. if ($str[$i]=='"' && $first==0) $first=0;
  7. }
  8.  
  9. $ex = explode('"',$str);
  10.  
  11. for($i=$first;$i<count($ex);$i+=2)
  12. {
  13. $ex[$i]=str_replace(' ','$$$',$ex[$i]);
  14. }
  15.  
  16. $str = implode('"',$ex);
  17. $ex = explode(" ",$str);
  18.  
  19. foreach($ex as $k=>$v) $ex[$k] = str_replace('$$$',' ',$v);
  20.  
  21. print_r($ex);
  22. ?>
Go to the top of the page
+Quote Post
JPCannon
post
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 22.05.2013

Ostrzeżenie: (0%)
-----


Teraz działa poprawnie. Pozostał mi jeszcze jeden problem użycia tego kodu. Program który robię analizuje stringa znak po znaku i tak musi zostać. Robię to z użyciem zwykłego str_split. Jest jakiś sposób, żeby od wystąpienia " przerywał rozdzielanie na pojedyncze znaki, albo potraktował wszystko pomiędzy " " jako jeden element takiej tablicy? W Przypadku przerwania przy cudzysłowiu, chciałbym wznowić proces rozkładania ponownie potem. Możecie coś podpowiedzieć?

Zastanawiam się nad takim rozwiązaniem, ale nie wiem jak przetłumaczyć to na kod:

-Jeżeli trafisz w zdaniu na " to:
polecenia
-Jeżeli trafisz w zdaniu na " drugi raz to:
polecenia

Z tym, że sekwencja ta musiała by się resetować po wystąpieniu drugi raz tego znaku. Same polecenia wewnątrz to już nie problem, ale nie wiem jak kazać mu zrobić co innego gdy trafi na dany znak drugi raz, a do tego tak by potem odliczał od nowa.

Rozwiązałem już problem smile.gif używając prostych ifów. Zwyczajnie nadałem dwa warunki. Jeśli program trafił na znak " to miał ustawić stan true, jeśli potem trafił na " to miał zmienić true na false i wzajemnie. Potem dodałem tylko warunek przy części rodzielającej po spacji, że warunkiem do wykonania entera jest nie tylko spacja ale też zmienna na false. Dwa ify nic poza tym wink.gif

if(tablica[i]=="\"" && cudz==false){
cudz=true;
}
else if(tablica[i]=="\"" && cudz==true){
cudz=false;
}

Dziękuję wszystkim za pomoc wink.gif

Ten post edytował JPCannon 31.05.2013, 15:20:18
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 12:28