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 22.12.2024 21:32:31
|
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: |