![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 58 Pomógł: 1 Dołączył: 15.06.2008 Ostrzeżenie: (10%) ![]() ![]() |
Witam, pracuję nad prostym skryptem, który pozwoli mi zakodować tekst używając mojego własnego kryptogramu.
Polegało będzie to na tym że skrypt ma za zadanie pozmieniać litery na swoje odpowiedniki (jakie mu wskaże) oraz obrócić tekst przy pomocy funkcji strrev (co akurat skomplikowane nie jest). Przygotowałem następujący skrypt:
Prawidłową odpowiedzią na "Wawa" powinno być "aG2G", a otrzymuję "GG2G". Jak widać problem dotyczy tego że po zamienieniu, stara się zamienić jeszcze raz, czyli: W -> a -> G A powinno być tylko: W -> a Próbowałem wprowadzić $limit = 1, jednak to się nie sprawdza do końca ponieważ wtedy otrzymujemy "Ga2a", czyli a nie jest już zamieniane bo zostało już raz zamienione. Niektórzy powiedzą że nie możesz wprowadzić liter których tutaj nie ma? Nie, bo chce zrobić tak z całym alfabetem, czyli nie da się tego tak ustawić aby się nie powtarzało (IMG:style_emoticons/default/winksmiley.jpg) Z góry dziękuję za pomoc Ten post edytował miki3475 27.07.2010, 17:10:51 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To ja Ci wyjaśnię dlaczego tak się działo. Mianowicie replace leci zawsze po kolei w swoich wzorcach. Jeśli więc się zdarzy, że któryś z kroków wcześniejszych zamieni fragment na taki, który wystąpi jako wzorzec później, to dopasuje się on do kolejnego wzorca i znów zamieni. Preg_match nie przerywa po pierwszym dopasowaniu, tylko leci dalej. Utworzy się więc łańcuch zmian, co zazwyczaj prowadzi do nieoczekiwanych wyników. Tak właśnie było w Twoim wypadku.
Inna sprawa, że w przykładzie będącym w Twoim pierwszym poście masz błąd, o czym prawdopodobnie nawet nie wiesz. $pattern[0] bowiem nie sparuje się z $replacement[0] (co wydawałoby się logiczne), tylko z $replacement[2]. Tak... Nie przewidziałeś się (IMG:style_emoticons/default/smile.gif) Parują się elementy nie według klucza a kolejności podania ich dla funkcji, tak więc 0(W) => 2(a), 1()a => 1(G), 2(w) => 0(2). Teraz popatrz na każdy krok dla słowa "Wawa" Przejście 1 wzorca -> W => a da nam: aawa Przejście 2 wzorca -> a => G da nam: GGwG Przejście 3 wzorca -> w => 2 da nam: GG2G Popatrz no.... Dokładnie to co Ci wyszło jako błąd (IMG:style_emoticons/default/winksmiley.jpg) Ja Ci zrobiłem to co preg_match, krok po kroku. Wiele osób się dziwi bo nie rozumie jak preg_match działa i przez to piszą złe reguły, choć logicznie są one prawidłowe. Ale logika ta nie wyklucza błędu na poziomie implementacji przez sam język. Trzeba po prostu wiedzieć, że należy tak pisać regułę, aby nie nastąpiło wielokrotne wymienienie w wyniku kolejnego sprawdzania podanych wzorców. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 58 Pomógł: 1 Dołączył: 15.06.2008 Ostrzeżenie: (10%) ![]() ![]() |
To ja Ci wyjaśnię dlaczego tak się działo. Mianowicie replace leci zawsze po kolei w swoich wzorcach. Jeśli więc się zdarzy, że któryś z kroków wcześniejszych zamieni fragment na taki, który wystąpi jako wzorzec później, to dopasuje się on do kolejnego wzorca i znów zamieni. Preg_match nie przerywa po pierwszym dopasowaniu, tylko leci dalej. Utworzy się więc łańcuch zmian, co zazwyczaj prowadzi do nieoczekiwanych wyników. Tak właśnie było w Twoim wypadku. Inna sprawa, że w przykładzie będącym w Twoim pierwszym poście masz błąd, o czym prawdopodobnie nawet nie wiesz. $pattern[0] bowiem nie sparuje się z $replacement[0] (co wydawałoby się logiczne), tylko z $replacement[2]. Tak... Nie przewidziałeś się (IMG:style_emoticons/default/smile.gif) Parują się elementy nie według klucza a kolejności podania ich dla funkcji, tak więc 0(W) => 2(a), 1()a => 1(G), 2(w) => 0(2). Teraz popatrz na każdy krok dla słowa "Wawa" Przejście 1 wzorca -> W => a da nam: aawa Przejście 2 wzorca -> a => G da nam: GGwG Przejście 3 wzorca -> w => 2 da nam: GG2G Popatrz no.... Dokładnie to co Ci wyszło jako błąd (IMG:style_emoticons/default/winksmiley.jpg) Ja Ci zrobiłem to co preg_match, krok po kroku. Wiele osób się dziwi bo nie rozumie jak preg_match działa i przez to piszą złe reguły, choć logicznie są one prawidłowe. Ale logika ta nie wyklucza błędu na poziomie implementacji przez sam język. Trzeba po prostu wiedzieć, że należy tak pisać regułę, aby nie nastąpiło wielokrotne wymienienie w wyniku kolejnego sprawdzania podanych wzorców. Hmm, ok postaram się coś wynieść z tej lekcji (IMG:style_emoticons/default/winksmiley.jpg) Wszystkim dzięki, encoder działa b. dobrze ;p |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 00:00 |