Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]preg_match_all
Crenos
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.01.2009

Ostrzeżenie: (10%)
X----


Nie wiem kompletnie jak napisać wzorzec do tej funkcji. Przeczytałem kilka razy Wiki: http://en.wikipedia.org/wiki/Regular_expression bawiłem się tym narzędziem http://rubular.com/
Ale nic sensownego mi nie wychodzi.

mam taki string

Cytat
pierwszy string { drugi string|trzeci string {czwarty string|piąty string}}|szósty string {{ósmy string|dziewiąty string} dziesiąty string}{jedenasty string|dwunasty string} trzynasty string


chciałbym aby wyglądał tak

  1. (
  2. [0] => Array
  3. (
  4. [0] => pierwszy string
  5. [1] => { drugi string|trzeci string {czwarty string|piąty string}}
  6. )
  7.  
  8. [1] => Array
  9. (
  10. [0] => szósty string
  11. [1] => {{ósmy string|dziewiąty string} dziesiąty string}
  12. [2] => {jedenasty string|dwunasty string}
  13. [3] => trzynasty string
  14. )
  15.  
  16. )


To oczywiście nie jest wszystko co bym chciał zrobić z tym stringme ale jeżeli ogarnę to myślę, że dalej sobie porodzę. Tylko poprosiłbym o prosty opis dokładnie który fragment za co odpowiada.
A odnośnie wzorca to chciałbym aby tak jak w przypadku array[0] separował string, który nie zawiera się w znakach {}, separował stringi w znakach {} ale żeby ilość { była równa ilości } oraz jeżeli pojawia się | żeby tworzył kolejna tablice po tym znaku.
Mam nadzieję, że w miarę przejrzyściej opisałem.
Pytanie jest też takie czy w ogóle da się to zrobić za jednym razem.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crenos
post
Post #2





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.01.2009

Ostrzeżenie: (10%)
X----


Dobrze napisałem coś inaczej troszkę niż proponowałeś. Tzn to tak jak by pierwszy poziom obrabiania całości ale mam pewien problem z parametryzacją i przekazywaniem odpowiednich wartości.
Spłodziłem takie coś.

te zmienne na początku nie są istotne dodawałem je w momencie kiedy kombinowałem, żeby mi błędów o braku zdefiniowanej wartości zmiennej nie wywalało.

  1. $tekst = 'pierwszy string { drugi string|trzeci string {czwarty string|piąty string}} |szósty string {{ósmy string| dziewiąty string} dziesiąty string} {jedenasty string| dwunasty string} trzynasty string';
  2. $separator ='|';
  3. $znak = array('{', '}');
  4. $mam=0;
  5. $pZnak=array();
  6. $pStart=0;
  7. $tablica= array();
  8. $aTablica =0;
  9. $b=0;
  10. $a=0;
  11. $fragment = $tekst;
  12. function licz($fragment, $znak)
  13. { $b=0;
  14. $c=0;
  15. for ($a=0; $a < strlen( $fragment ); $a++)
  16. {
  17. if ( $fragment[$a] == $znak[0] )
  18. {
  19. $pZnak['{'][$b]=$a;
  20. $b++;
  21. }
  22. if ( $fragment[$a] == $znak[1] )
  23. {
  24. $pZnak['}'][$c]=$a;
  25. $c++;
  26. }
  27. }
  28. return $pZnak;
  29. }
  30. $zmienna = licz($fragment, $znak);
  31. print_r($zmienna);
  32. $pStart=0; //pozycja startowa do wyszykiwania
  33. while($i < strlen( $tekst )){
  34. if ($tekst[$i] != $znak[0]){ //sprawdzam czy $tekst[$i] jest różny {
  35. $pSeparator = stripos($tekst, $znak[0], $off); // sprawdzam pozycję najbliższego znaku {
  36. $fragment = substr($tekst, $pStart, $pSeparator); // pobieram fragment stringa do znaku {
  37. $tablica[$aTablica]= trim($fragment); // dodaje do tablicy fragment stringa
  38. $aTablica++;
  39. $i=$pSeparator; // przestawiam $i na pozcyję gdzie skończyłem przeszukiwania dla pętli
  40. $off = $pSeparator; // offset przestawiam na pozycje gdzie skończyłem przeszukiwanie dla funkcji stripos
  41. $pStart=$pSeparator; // pozycja startowa do przeszukiwania stringu
  42. //break;
  43. }
  44. elseif($tekst[$i] == $znak[0]){ //sprawdzam czy $tekst[$i] to znak {
  45. $fragment = substr($tekst, $pStart, strlen( $tekst )); //pobieram string od ostatniego sprawdzenia $pStart do końca
  46. $pzZnak = licz($fragment, $znak); // sprawdzaj pozycję wszystkich znaków { }
  47. while($d < count($pzZnak['{'])){ //dopsowuje zamkniecie do otwartych nawiasów
  48. if ( $pzZnak['{'][$d]>$pzZnak['}'][$d-1]){ // jeżeli pozycja znaku { jest większa od poprzedniej pozycji znaku } oznacza, że nawiazy pasują do siebie
  49. $pZamkniecie=$pzZnak['}'][$d-1]; // pobieram pozycję znaku } pasującego do {
  50. $d=count($pzZnak['{']); // wyłączam pętle
  51. }
  52. $d++;
  53. }
  54. $fragment = substr($fragment, 1, $pZamkniecie-1); //pobieram fragment tekstu gdzie ilość znaków { równa się ilości znaków } i wywalam brzegowe {}
  55. $tablica[$aTablica]= trim($fragment); // dodaje do tablicy
  56. $aTablica++;
  57. $i=$i+$pZamkniecie+1; // przestawiam $i na pozcyję gdzie skończyłem przeszukiwania dla pętli
  58. $off = $i+$pZamkniecie; // offset przestawiam na pozycje gdzie skończyłem przeszukiwanie dla funkcji stripos
  59. $pStart = $pStart+$pZamkniecie+1; // pozycja startowa do przeszukiwania stringu
  60. //break;
  61. }
  62. }


I powiedzmy działa to "prawie dobrze" bo: efekt jest taki:
Kod
Array
(
    [0] => pierwszy string
    [1] => drugi string|trzeci string {czwarty string|piąty string}
    [2] => |szósty string {{ósmy string| dziewiąty string} dziesiąty string} {jedenasty string| dwunasty string} trzynasty string
    [3] => jedenasty string| dwunasty string} trzynasty string
)


Problem polega na tym, że już w 3 rekordzie skrypt się gubi czyli $pStart i $off źle przekazują parametry. kombinowałem już na różne sposoby ale wydaje mi się że błąd leży w konstrukcji całości. Później będę to przebudowywał, żeby rozkładał cały ciąg do końca a nie tylko pierwszy poziom ale na początku muszę opanować pierwszy poziom. Co do użycia Case to będę miał konkretne fragmenty to pewnie użyje tej pętli.

Ten post edytował Crenos 4.04.2013, 16:52:37
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 8.10.2025 - 23:44