![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
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
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. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Pokaż co już masz.
-------------------- 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). |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
Z takim czymś walczyłem ale to nie działa tak jak bym chciał po zatym nie dokońca potrafię sobie poradzić z tym, żeby to podzielić tym znakiem |
Cytat /([[:alpha:]]+\s[[:alpha:]]+)|([{^]+[^}]*.[^}]*.)/
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Najlepiej chyba zaczac wyszukiwac zewnetrzne wartosci i dopiero pozniej zaweżac wyszukiwane jadac liniowo.
Czyli na koncu ma to wygladac tak? Kod Array
( [0] => Array ( [0] => pierwszy string [1] => Array ( [0] => drugi string [1] => cpzeci string ) ) [1] => Array ( [0] => szosty string [1] => Array ( [0] => Array ( [0] => osmy string [1] => dziewiaty string ) [1] => dziesiaty string ) [2] => Array ( [0] => jedenasty string [1] => dwunasty string ) [3] => Array ( [1] => trzynasty string ) ) ) -------------------- Pomoglem? Daj pomogl!
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
Dokładnie tak ma to wyglądać
I sam już nie wiem czy to ma być na wyrażeniach regularnych czy pętlami obrabiać ten string. Znalazłem nawet generator regexpów ale nie robi dokładnie tego co bym chciał i jeszcze nie potrafię zmodyfikować tego co mi wypluje. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Jednym preg_match tego nie zrobisz. Napisz prosty parser, natrafia na { to "otwiera" nowa tablice, natrafia na } to ja "zamyka" i przechodzi do kolejnego elementu, natrafia na | to przechodzi do kolejnego elementu aktualnie "aktywnej" tablicy.
-------------------- Pomoglem? Daj pomogl!
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
A znasz jakiś fajny tutorial od podstaw z przykładami? bo to co tutaj jest preg_match to dla mnie zbyt duży poziom abstrakcji. Bo niby jakiś wzorzec jestem w stanie ułożyć prawie działa ale, przyznaje się robię to na "pałę" i nie do końca rozumiem dla czego on tak działa chociaż wg. mnie działać powinien inaczej.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Chyba najlepiej samemu probowac: http://www.php.net/manual/en/book.pcre.php
-------------------- Pomoglem? Daj pomogl!
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
Stworzyłem takie coś dla takiego stringa
Kod 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 To bez problemu pobiera substring do pierwszego { Kod (^[^{]+) Ten wzorzec pobiera "{ drugi string|trzeci string {czwarty string|piąty string}}" Kod ({[^{]+.+.}}+) Czy ta się go jakoś dopasować aby pobierał x nawiasów czy muszę dla każdej opcji pisać oddzielny. Problem mem jeszcze z pobraniem tego "szósty string" Kod ([^}}]+.[{][{]) Tylko to zabiera ze sobą jeszcze na końcu {{ No i ostatni ciąg "trzynasty string" nie mam bladego pojęcia jak się zabrać do tego bo dubluje mi się z innymi wzorcami. Ten post edytował Crenos 2.04.2013, 21:31:00 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Uzywanie regexpa do tego jest kiepskim pomyslem. Lepiej sprawdzac po kolei kazdy znak, a poniewaz masz tylko 3 mozliwosci to jest to proste.
Uzyj case i sprawdzaj czy znak to {, } czy |, jako default po prostu dodaj znak do poprzednio aktywnej zmiennej (tablicy). Jezeli znak jest { to aktualna zmienna jest zamieniana na tablice i przechodzisz do 1. elementu (przekazanie przez referencje), jesli znak to | to po prostu nowy element w aktualnie aktywnej tablicy, jesli } to wychodzisz z tablicy (tutaj jest problem, bo musisz przejsc do tablicy wyzej, wiec musisz znalezc jakis prosty sposob). Takie rozwiazanie zapewnia duza elastycznosc, mozesz takich stringow miec milion i nadal bedzie dzialalo. -------------------- Pomoglem? Daj pomogl!
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
jako default po prostu dodaj znak do poprzednio aktywnej zmiennej (tablicy) A możesz pokierować mnie np jakimś przykładem ? Bo to o czym piszesz już przerabiałem tylko zatrzymałem się w martwym punkcie ale nie robiłem tego na case tylko po prostu na pętli i na ifach |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
A jak tak sobie patrze, referencje do tablic (lub tez warstw, jak kto woli) wyzej wzgledem aktualnej mozna przechowywac w innej tablicy, gdzie ostatni element przechowuje np. $a[0][0][0], a n-1 $a[0][0]. Ten post edytował artuross 2.04.2013, 22:32:33 -------------------- Pomoglem? Daj pomogl!
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
Chodziło mi o przejście do poprzednio aktywnej zmiennej(tablicy)
![]() |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Heh tego nie wiem, nie znam funkcji, ktora by to umozliwila, ale moze cos takiego:
Ten post edytował artuross 2.04.2013, 22:42:08 -------------------- Pomoglem? Daj pomogl!
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 17.01.2009 Ostrzeżenie: (10%) ![]() ![]() |
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.
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 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 164 Pomógł: 9 Dołączył: 30.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Uzyj roznych funkcji, ktore zaleznie od wystepujacego znaku, beda sie do siebie odnosic.
Chodzi o to, by nie zaglebiac sie w nie-wiadomo-ile-if'ow. Jedna funkcje realizuje konkretna operacje, przy czym caly czas korzysta z jednego 'pointera' do konkretnej wartosci. I tak, masz string 'string-1 { string-2 { string-3|string-4}}' Wykonujesz petle i za kazdym razem, gdy znak jest rozny od {}| to wywolujesz funkcje string, ktorej przekazujesz znak, i tablice z wartosciami. Gdy znak jest rowny { to musisz w obecnej tablicy utworzyc kolejna, wiec po prostu przekazujesz tablice i zamieniasz ja na tablice. Gdy znak jest rowny | to pobierasz key aktualnego elementu i tworzysz nowy element (ten key musisz gdzies zapisac, zeby sie pozniej do niego odnosic, albo mozesz stworzyc referencje do niego i zapisac w jakiejs-tam-zmiennej-ktora-zawsze-jest-uzywana. Jesli znak jest } to 'zamykasz', aktualna petle i przechodzisz do nastepnego elementu w tablicy wyzej warstwowo (i tutaj juz pisalem, caly myk polega na tym, by dobrze wykonac ten element, reszta nie ma znaczenia). Opcja alternatywna, ktora teraz przyszla mi do glowy to zliczenie wszystkich utworzenie podciagow, tzn. najpierw wyciagasz najbardziej zewnetrzne ciagi (np. mozesz zliczyc wszystkie {, nastepnie }, i gdy ich roznica bedzie rowna 0 to zapisujesz calosc pomiedzy tymi dwoma do kolejnego elementu tablicy). Pozniej robisz to samo z ciagami, ktore powstaly, itd., itd., az ilosc wykonanych operacji bedzie rowna 0, wtedy przerywasz wykonywanie. -------------------- Pomoglem? Daj pomogl!
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 19:51 |