Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Mikser treści - problem z wielokrotnym zagnieżdżeniem losowanej treści
malvor
post 30.12.2013, 16:03:04
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.12.2013

Ostrzeżenie: (0%)
-----


Hej,
Mam pewien problem z miksowaniem treści. Mianowicie użytkownik ma pewien formularz, który po wypełnieniu generuje mi treść o następującej treści:

{Masz na imie|Nazywasz się} [pole_imie]. {Na tej stronie {znajdziesz|możesz odnaleźć}|Witryna oferuje} treści związane z {ogłoszeniami|{informacjami|{wiadomościami}} z Twojej okolicy, co pokrywa się z Twoimi preferencjami...

Tagi pomiędzy {} są wpisywane przez administratora, natomiast [] to pola z formularza. Nie miałbym problemu z parsowaniem czegoś takiego, gdyby nie fakt, że potrzebne są wielokrotne zagnieżdżenia. Próbuję od kilku godzin stworzyć działającą funkcję rekurencyjną do obsługi tego.

Jest ktoś w stanie poradzić coś w tym temacie?
Go to the top of the page
+Quote Post
Wazniak96
post 30.12.2013, 17:24:49
Post #2





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

Ostrzeżenie: (0%)
-----


Wydaje mi się, że można to rozwiązać bez rekurencji, a mianowicie dane umieścić w tablicach i je ewentualnie zagnieżdżać. smile.gif
W każdym razie mój pomysł rozwiązania wyglądałby mniej więcej tak:
  1. $los = array_rand($tab);
  2. while(is_array($los))
  3. $los = array_rand($los);
Go to the top of the page
+Quote Post
malvor
post 31.12.2013, 08:56:21
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.12.2013

Ostrzeżenie: (0%)
-----


No tak, ale w jaki sposób stworzyć taką tablice mając tak zagnieżdżony tekst wpisany przez użytkownika?
Go to the top of the page
+Quote Post
gitbejbe
post 31.12.2013, 10:55:41
Post #4





Grupa: Zarejestrowani
Postów: 515
Pomógł: 63
Dołączył: 27.08.2012

Ostrzeżenie: (0%)
-----


staram się zrozumieć problem, ale nie wiem co dokładnie masz na myśli.

co to znaczy miksowanie treści ? Co to za formularz/do czego ? najlepiej wklej kod i napisz dokładnie czego oczekujesz
Go to the top of the page
+Quote Post
malvor
post 31.12.2013, 12:31:21
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.12.2013

Ostrzeżenie: (0%)
-----


Kodu na chwilę obecną nie mam (jestem w trakcie tworzenia). Chodzi dokładnie o opis warsztatu samochodowego. Gdy klient doda swój warsztat do bazy danych na podstawie szablonu zostanie wygenerowany jego opis. Aby opis nie był jednakowy dla wszystkich warsztatów należy go zmiksować. Administrator serwisu podaje szablon w postaci:

{Zapraszamy do|Wszystkich Państwa zachęcamy do {odwiedzenia|zapoznania się z ofertą}} warsztatu [nazwa] {znajdującego się|z siedzibą} w mieście [miasto]

Co oznacza że z pierwszego nawiasu {} zostanie wybrana jedna z opcji (opcje oddzielone znakiem |): Zapraszamy do lub Wszystkich Państwa zachęcamy do {odwiedzenia|zapoznania się z ofertą} i tutaj mamy kolejne zagnieżdżenie możliwych do wylosowania elementów odwiedzenia lub zapoznania się z ofertą. tagi w nawiasach [] to pola które będą parsowane na podstawie danych pobranych z formularza uzupełnionego przez klienta.

Od razu odpowiem na pytanie, musi być to skrypt idioto odporny i generować treść z wieloma zagnieżdżeniami np.
{Opcja 1|Opcja 2|{Opcja 3.1|Opcja 3.2|{Opcja 3.3.1|Opcja 3.3.2}}|Opcja 4} itd.

Dlatego rozwiązanie Wazniak96 nie wchodzi w grę.
Go to the top of the page
+Quote Post
vermis
post 31.12.2013, 12:52:08
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

Ostrzeżenie: (0%)
-----


To wyrażenie powinno znaleźć ci najbardziej zagnieżdżone zwroty (bez innych wewnątrz):
Kod
{([^{]+?)}

Czyli robisz preg_match(), losujesz co wstawić i podmieniasz.
Lecisz w pętli aż nic nie znajdze.

Ten post edytował vermis 31.12.2013, 12:52:33


--------------------
Go to the top of the page
+Quote Post
malvor
post 31.12.2013, 13:29:58
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 30.12.2013

Ostrzeżenie: (0%)
-----


Wyrażenie jest całkiem niezłe, wielkie dzięki. Ale mam kolejny problem, w jaki sposób teraz robić to na odpowiednie klamry. Ponieważ obecnie działa to tak, że jeśli mamy
{Zapraszamy do|Wszystkich Państwa zachęcamy do {odwiedzenia|zapoznania się z ofertą}} warsztatu [nazwa] {znajdującego się|z siedzibą} w mieście [miasto]
To dla pierwszego zagnieżdżenia działa prawidłowo, niestety dla drugiego ({znajdującego się|z siedzibą}) pobiera nam elementy z pierwszego ({odwiedzenia|zapoznania się z ofertą})

Ok rozwiązane. Gdyby ktoś kiedyś potrzebował:

  1. while( strpos($tekst, '}') )
  2. {
  3. preg_match('/{([^{]+?)}/', $tekst, $matches);
  4. $tablica = explode('|',$matches[1]);
  5. $tekst = str_replace($matches[0], $tablica[array_rand($tablica)] , $tekst);
  6. }


Ten post edytował malvor 31.12.2013, 14:33:01
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 13:10