Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mikser treści - problem z wielokrotnym zagnieżdżeniem losowanej treści
Forum PHP.pl > Forum > PHP
malvor
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?
Wazniak96
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);
malvor
No tak, ale w jaki sposób stworzyć taką tablice mając tak zagnieżdżony tekst wpisany przez użytkownika?
gitbejbe
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
malvor
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ę.
vermis
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.
malvor
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. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.