Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyświelaj od znaku do znaku
Forum PHP.pl > Forum > Przedszkole
JPCannon
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
!*!
  1. preg_match('/([A-Za-z]+)\s\"([a-z\s]+)\"/', $str, $match)

pisane z palca, ale mniej więcej tak to powinno być.
JPCannon
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?
Arcioch
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. ?>
JPCannon
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ć.
Gość
  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. ?>
JPCannon
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.