ForumCała strona

Nawigacja

Aktualnie online

Gości online: 10

Użytkowników online: 0

Łącznie użytkowników: 25,393
Najnowszy użytkownik: Assassin

Logowanie

Nazwa użytkownika

Hasło



Zarejestruj się

Odzyskaj hasło

Shoutbox

Musisz zalogować się, aby móc dodać wiadomość.

JazOOn
06.12.2024 23:45:46
Amen

Zbigniew@
17.11.2024 11:33:24
Nie ten grzeszy kto pije, ale ten, kto się nie upije.

JazOOn
16.11.2024 20:46:18
tja

Zbigniew@
15.11.2024 18:58:17
Kto pije, ten nie bije.

JazOOn
31.10.2024 20:49:47
Kto pije?

Pobierz nową wersję
Pobierz podręcznik
Zobacz inne oficjalne Supporty
Statystyki supportu
PHP-Fuson PL na Facebooku

RSS

Polecamy hosting SferaHost.pl

Zobacz temat

 Drukuj temat
[PHP] Funkcja oparta o preg_replace
QooBooS
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:
  1. Zmiana nazwy tematu - Pieka 10.02 - 21:08

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

Polecamy hosting SferaHost.pl
IP: localhost  
Seba0p
Pobierz kod źródłowy  Rozwiń Kod źródłowy
 
http://seba0p.pl
QooBooS
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
Pobierz kod źródłowy  Rozwiń Kod źródłowy



Widzę, że edytowałeś post.


O to Ci teraz chodzi ?

Pobierz kod źródłowy  Rozwiń Kod źródłowy

Edytowane przez Seba0p dnia 11.02.2010 00:35:14
 
http://seba0p.pl
QooBooS
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:

Pobierz kod źródłowy  GeSHi: PHP
  1. if ($plur == '')
  2. {
  3. //wykonaj preg_replace dla liczby pojedynczej
  4. } else {
  5. //wykonaj preg_replace dla liczby mnogiej
  6. }
Zinterpretowano w sekund: 0.053, wykorzystano GeSHi 1.0.8.10


Jak na razie wykombinowałem tak (ale nie działa):
Pobierz kod źródłowy  Rozwiń Kod źródłowy


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
Jak coś, to troszkę poprawiony Twój:

Pobierz kod źródłowy  Rozwiń Kod źródłowy

Edytowane przez Seba0p dnia 11.02.2010 00:58:29
 
http://seba0p.pl
QooBooS
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:
Pobierz kod źródłowy  Rozwiń Kod źródłowy


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:
Created by Arox Copyright (C) 2004
Copyright (C) 2004 - 2018 Ekipa PHP-Fusion.pl