Zobacz temat
|
[PHP] Funkcja oparta o preg_replace
|
|
| QooBooS |
Dodany dnia 10.02.2010 21:05:26
|
|
Przedszkolak ![]() Postów: 52 Data rejestracji: 02.06.2008 22:31 |
Witam! Od jakiego? czasu zajmuj? si? tworzeniem edytora dla ekipy t?umacz?cej. Dzia?a on przez przegl?dark?, jest oparty o PHP i baz? MySQL. Jak do tej pory wszystko sz?o g?adko i wszystko dzia?a?o bez zarzutu, lecz ostatnio twórcy gry, któr? t?umaczymy, wprowadzili kilka nowych funkcji, poszerzaj?cych mo?liwo?ci t?umacz?cych j? ludzi. Chodzi tu o sytuacj?, gdy dany przedmiot czy cokolwiek, co jest do przet?umaczenia, mo?e wyst?powa? w liczbie mnogiej. W takiej sytuacji po s?owie odmienianym stawiamy [f:"liczbamnoga"]. Tyczy si? to jedynie s?owa, które poprzedza kwadratowy nawias. Dzia?a to w ten sposób: "Jest to przyk?adowy tekst[f:"teksty"] do przet?umaczenia" Nie b?d? si? rozpisywa? na temat dzia?ania tego rozwi?zania w grze, bo nie o to tu chodzi. Moim zadaniem jest zrobienie tego samego na stronie internetowej. Skrypt PHP pobiera z bazy danych wpis, który przyk?adowo wygl?da tak, jak napisa?em wy?ej. Chcia?bym móc sterowa? czy wy?wietli? liczb? pojedyncz?, czy mnog?. Do tej pory napisa?em taki "wzór" dla funkcji preg_replace, lecz nie dzia?a (pewnie nawali?em w nim wiele zb?dnych rzeczy lub, co gorsza, napisa?em co? zupe?nie ?le). /^(.*)(\s?)(\S+)(\[f:")?(.+)("\])?(.*)$/e Niestety nie potrafi? wyja?ni?, dlaczego akurat tak, kierowa?em si? intuicj? :P Potrzebuj? wzoru, który b?dzie dzia?a? w ka?dej sytuacji, tzn. nawet je?li przed i po s?owie "tekst" (z przyk?adu) nie wyst?puje nic, np.: "tekst[f:"teksty"]" <-- i koniec Pisz?c powy?szy wzór chcia?em osi?gn?? co? takiego: (dowolny tekst lub jego brak)*(spacja lub jej brak)?(tekst bez spacji)(liczba mnoga lub jej brak)*(dowolny tekst lub jego brak)*. Chcia?bym móc wy?wietli? "tekst", gdy brak odpowiednio sformatowanego kwadratowego nawiasu lub "teksty", gdy ten wyst?puje. Oczywi?cie reszta tekstu, czyli "Jest to przyk?adowy " oraz " do t?umaczenia", powinna pozosta? nienaruszona. Prosz? o szybk? odpowied? - t?umacze czekaj? :) Pozdrawiam. EDIT: Dla zobrazowania dzia?ania takiej funkcji, napisz? kilka przyk?adów: //Wyci?ganie liczby mnogiej: "To jest[f:"s?"] przyk?adowy[f:"przyk?adowe"] tekst[f:"teksty"] do t?umaczenia" -> "To s? przyk?adowe teksty do t?umaczenia" //Wyci?ganie liczby pojedynczej: "To jest[f:"s?"] przyk?adowy[f:"przyk?adowe"] tekst[f:"teksty"] do t?umaczenia" -> "To jest przyk?adowy tekst do t?umaczenia" //Nietypowe sytuacje: "Tekst[f:"Teksty"]" -> "Teksty" (dla l.mn.) lub "Tekst" (dla l.poj.) "Tekst do t?umaczenia" -> "Tekst do t?umaczenia" (bez zmian) "Tekst[f:"Teksty"] do t?umaczenia" -> "Teksty do t?umaczenia" itd... PW od moderatora:
Edytowane przez QooBooS dnia 10.02.2010 21:38:02 |
|
|
|
| W?cibski Go?? |
Dodany dnia 24.10.2025 18:07:07
|
|
Pan Kontekstualny Postów: n^x Data rejestracji: Zawsze |
|
| IP: localhost | |
| Seba0p |
Dodany dnia 10.02.2010 23:34:35
|
|
Pocz?tkuj?cy ![]() Postów: 127 Pomógł: 25 Data rejestracji: 24.07.2007 11:28 |
|
|
|
|
| QooBooS |
Dodany dnia 10.02.2010 23:41:45
|
|
Przedszkolak ![]() Postów: 52 Data rejestracji: 02.06.2008 22:31 |
Musz? przyzna?, ?e jestem pod wra?eniem :) No i ogromnie si? ciesz?, ?e jednak t?umaczenie ruszy dalej ;) Serdeczne dzi?ki! :) Uratowa?e? mi ?ycie. Teraz tylko nurtuje mnie jedna sprawa: jak, do jasnej ciasnej, to dzia?a? W ogóle nie pasuje mi te wzór, który poda?e? :) Nigdy bym w ten sposób go nie napisa?. Jakby? móg? to wyja?nij. EDIT: Aha, jest jeszcze sprawa rozró?niania znacznika [plur] - informuje on gr?, ?e za chwil? wyst?pi zmienna, któr? trzeba b?dzie potraktowa? w liczbie mnogiej. Przyk?ad: "Dzisiaj kupi?em 5 kilo [plur][%dic:STR_DIC_MARCHEW]." -> "Dzisiaj kupi?em 5 kilo marchwi." [%dic:...] to dla gry informacja, ?e ma wczyta? tekst ze "s?owniczka". W s?owniczku definicja s?owa marchew wygl?da tak: STR_DIC_MARCHEW = "Marchew[f:"Marchwi"]". Czyli gra musi wczyta? to, co ju? zrobi?e?. Wczytanie tej zmiennej ju? mam, chodzi mi o rozró?nianie, czy przy danej definicji stoi [plur] i odpowiednie przekazanie parametru do funkcji, aby ta u?y?a sposobu nr 1 (tego z \\1) lub 2 (tego z \\3). Pseudokodem: je?li przy znaczniku [%dic:...] stoi [plur], wykonaj wczytajZeSlownika('zawartosc_tagu_dic', 'lmn'), a je?li nie, wykonaj wczytajZeSlownika('zawartosc_tagu_dic', 'lpoj'). Mo?e by? te tak, ?e funkcja b?dzie dostawa? co? w przypadku wyst?pienia [plur], a w przypadku jego braku ''. Ja to widz? tak: wczytajZeSlownika('\\3', '\\1'), przy czym \\3 to b?dzie zawarto?? tagu dic, a \\1 to zawarto?? tagu plur (je?li go nie ma, to nic tam nie wstawi). Teraz jeszcze ta druga funkcja i b?dzie z g?owy :) Edytowane przez QooBooS dnia 11.02.2010 00:15:28 |
|
|
|
| Seba0p |
Dodany dnia 11.02.2010 00:15:39
|
|
Pocz?tkuj?cy ![]() Postów: 127 Pomógł: 25 Data rejestracji: 24.07.2007 11:28 |
Widz?, ?e edytowa?e? post. O to Ci teraz chodzi ? Edytowane przez Seba0p dnia 11.02.2010 00:35:14 |
|
|
|
| QooBooS |
Dodany dnia 11.02.2010 00:36:02
|
|
Przedszkolak ![]() Postów: 52 Data rejestracji: 02.06.2008 22:31 |
Nie dok?adnie o to mi chodzi?o. By? mo?e ?le wyt?umaczy?em. Skrypt dostaje jaki? tekst, np.: $contents = "Dzisiaj kupi?em 5 kilo [plur][%dic:STR_DIC_MARCHEW] w spo?ywczym"; ma za zadanie wyszuka? w ca?ym tym tek?cie pojedynczego [%dic:STR_DIC_MARCHEW], sprawdzi? czy nie poprzedza go [plur] i wywo?a? funkcj? wczytajZeSlownika('STR_DIC_MARCHEW', 'plur'); (lub, je?li nie ma plur'a, drugi parametr ma by? pusty). I tak do ka?dego [%dic:...' z osobna. Nast?pnie funkcja wczytajZeSlownika($text, $plur); wczytuje z bazy danych wpis ze s?ownika, w którym nazwa='STR_DIC_MARCHEW' (czyli $text). Z bazy zwracana jest warto?? pola 'nazwa_polska', w którym jest takie co?: Marchew[f:"Marchwi"] Nast?pnie funkcja, w zale?no?ci od tego, czy jest plur, czy nie ma, wykonuje: Jak na razie wykombinowa?em tak (ale nie dzia?a): Wiadomo?? doklejona: No, nareszcie! Twój ostatni post poprawi? mi humor :) Kod, który poda?e?, dzia?a :) Jeszcze raz serdeczne dzi?ki za pomoc! :D Edytowane przez QooBooS dnia 11.02.2010 00:44:13 |
|
|
|
| Seba0p |
Dodany dnia 11.02.2010 00:52:25
|
|
Pocz?tkuj?cy ![]() Postów: 127 Pomógł: 25 Data rejestracji: 24.07.2007 11:28 |
Jak co?, to troszk? poprawiony Twój: Edytowane przez Seba0p dnia 11.02.2010 00:58:29 |
|
|
|
| QooBooS |
Dodany dnia 11.02.2010 00:58:33
|
|
Przedszkolak ![]() Postów: 52 Data rejestracji: 02.06.2008 22:31 |
Dzi?ki, dzi?ki :) Ka?da optymalizacja si? przyda. Teraz przynajmniej wygl?da profesjonalnie :D Nie spodziewa?em si?, ?e rozwi??? ten problem jeszcze dzi? (nie patrz?c na zegarek), a tu takie mi?e zaskoczenie :) Nie b?d? Ci? ju? spamowa? tymi "pomóg?", bo Ci? za bardzo rozpieszcz? :P Dzi?ki za pomoc. Wiadomo?? doklejona: Witam. Mam kolejny problem. Kolejnym tagiem jest s?owo w zale?no?ci od p?ci, np. zabra?e?[f:"zabra?a?"]. Powinno dzia?a? to, co mi poda?e? do sprawdzania [pl:""], lecz, z niewiadomych przyczyn, nie dzia?a. W zale?no?ci od podanej w formularzu p?ci (dwa pola typu radio, name='plec', warto?ci m i z. linijka, która powinna zast?pi? wszystkie tagi wygl?da tak: zmienna $contents zawiera przyk?adowo taki tekst: Wreszcie si? obudzi?e?[f:"obudzi?a?"]! po wybraniu p?ci m?skiej powinno wy?wietli? "Wreszcie si? obudzi?e?", a w przeciwnym wypadku - "Wreszcie si? obudzi?a?". Co jest ?le? Cudzys?owy nie s? eskejpowane r?cznie, by? mo?e robi to formularz, wpakowuj?c je do $_POST. Wiadomo?? doklejona: Rozwi?za?em problem. Formularz przysy?a? mi \"tekst\" zamiast "tekst". U?y?em stripslashes($tekst) i wszystko gra :) Edytowane przez QooBooS dnia 11.02.2010 22:14:22 |
|
|
|
| Przejdź do forum: |
















