Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podmiana tekstu na zmienną
Forum PHP.pl > Forum > PHP
daniel1302
Witam, mam taki skrypt
  1. <?php
  2. $table['imie'] = 'Jan';
  3. $table['nazw'] = 'Kowalski';
  4. $table['wiek'] = '30';
  5. $tekst1 = "Imię: #imie\n Nazwisko: #nazw\n Wiek: #wiek";
  6. echo preg_replace('/#{1}([a-z0-9_\-]{3,})/i', '$table[\'$1\']', $tekst1);
  7. ?>


Wszystko działa ładnie, tyle że zamiast
Imię: Jan
Nazwisko: Kowalski
Wiek: 30


Wyświetla się
Imię: $table['imie']
Nazwisko: $table['nazw']
Wiek: $table['wiek']


Jak wstawić tą zmienną do tekstu. Próbowałem na wiele sposobów i nieznalazłem rozwiązania
wookieb
preg_replace_callback A tak swoją droga to wydaje mi się ze wystarczy str_replace. Ale oczywiście zależy od tego co chcesz z tym jeszcze robić smile.gif

@UP Taki mądry? To podaj rozwiązanie.
daniel1302
O co chodzi z tym

Cytat
@UP Taki mądry? To podaj rozwiązanie.

wookieb
Jeden mądrala darł się o podstawach ale już usunął post.
daniel1302
Mój poprawiony skrypt wygląda tak
  1. <?php
  2. $table['imie'] = 'Jan';
  3. $table['nazw'] = 'Kowalski';
  4. $table['wiek'] = '30';
  5. $tekst1 = "Imię: #imie\n Nazwisko: #nazw\n Wiek: #wiek";
  6. $tekst1 = preg_replace_callback('/#{1}([a-z0-9_\-]{3,})/i', create_function('$matches',
  7. 'return \'.$table[$matches[1]].\';'), $tekst1);
  8. echo $tekst1;

Ale wyświetla to
Imię: .$table[$matches[1]]. Nazwisko: .$table[$matches[1]]. Wiek: .$table[$matches[1]]


zaś
  1. create_function('$matches',
  2. 'return $table[$matches[1]];')

wyświetla
Imię: Nazwisko: Wiek:
wookieb
przeciez funkcja nie ma dostepu do $table... Wiec musisz dodac w srodek
  1. global $table;
daniel1302
Właśnie zauważyłem, ale za późno dzięki masz 2 plusy
thek
A ja sie zastanawiam czy nie prościej było zastosować zwykle łączenie?
  1. $tekst1 = 'Imię: '.$table['imie'].' Nazwisko: '.$table['nazw'].' Wiek: '.$table['wiek'];

Mniej problemów, wywoływania dodatkowych funkcji zamieniających... Dodatkowo trzeba uważać na to by ów ciąg, jaki jest podmieniany, nie pojawił się w treści. Osobiście uważam, że prostsze rozwiązanie jest nie tylko bezpieczniejsze pod tym względem, ale i szybsze w wykonaniu. Choć jeśli to pytanie było w celach edukacyjnych to czemu nie. Na normalnym serwerze jednak najprostsze rozwiązania są z reguły najlepsze i zazwyczaj najszybsze smile.gif
Fifi209
A od czego jest sprintf ?

  1. $test = 'Mam na imie: %s, a moje nazwisko to: %s';
  2.  
  3. echo sprintf($test, 'Jan', 'Kowalski');
daniel1302
Ale ja to potrzebuję do większej ilości podmian, ujdednolicenie zapytań chcę osiągnąć. Thek, powiedzmy, że chcę tą funkcje uruchomić w kilku klasach, gdzie każda tabela($this->table[]) jest inna i za każdym wywołaniem muszę zastąpić innym elementem?
thek
Jeśli chcesz używać tego w kilku klasach, to może się okazać, że callbacki też będziesz musiał definiować dla każdej klasy osobno, zajrzyj do pierwszego komentarza w manualu php tyczącym preg_replace_callback.
Poza tym napisanie jednolitej metody, w momencie gdy masz różne klasy i różne elementy w nich to igranie nieco z ogniem bo musisz zawsze wiedzieć co jest na którym miejscu w tablicy wzorców i tablicy z danymi zastępczymi. Inaczej może się okazać, że pomyliłeś kolejność elementów
Na pewno używanie wyrażeń regularnych jest wygodne, ale nie zawsze daje się zastosować jako uniwersalna metoda do wszystkiego. Ogólnie jestem za ich stosowaniem, ale dla części przypadków nie ma co uruchamiać wyrażeń regularnych jeśli użycie ich można zastąpić prostszymi metodami. Czasem właśnie zwykła konkatenacja lub wywołanie prostszego preg_replace z odpowiednimi parametrami daje to samo co preg_replace_callback. Kwestia rozsądku w stosowaniu i nie przesadzania z uwielbieniem dla wyrażeń. Nie zawsze jest sens je stosować i trzeba umieć balansować pomiędzy używaniem ich a czegoś prostszego. Tu już wychodzi wyczucie, doświadczenie i analizy czasowe smile.gif
  1. preg_replace($wzorzec_zmiennych_zastępowanych, $tablica_z_danymi do_zastąpienia, $tekst)

Da dokładnie to samo co wyskoczenie z callbackiem. A jest na pewno szybsze, bo funkcja nie musi wyskakiwać z preg by się odwołać do zewnętrznej funkcji. Każde takie wyskoczenie to drobny narzut czasowy, który sam sobie fundujesz gratis.
daniel1302
To tak nie będzie działało.

Mam jeszcze problem, wpisałem te funkcje w swoją klasę ale create_function niedziała poprawnie w innej fukcji tj. jakoś nie obsługuje ani $this-> xxx
ani global xxxx;
  1. public function prepareExpression($parms)
  2. {
  3. $structure = $this -> TableStructure;
  4. echo preg_replace_callback('/#{1}([a-z0-9_\-]+)/i', create_function('$matches', 'global $structure;
  5. return $structure[$matches[1]];'), $parms);
  6. }

Macie może jakieś rozwiązanie na ten problem?
wookieb
pamietaj ze to jest callback wiec moze byc tez cos takiego
  1. public function prepareExpression($parms)
  2. {
  3. $structure = $this -> TableStructure;
  4. echo preg_replace_callback('/#{1}([a-z0-9_\-]+)/i', array($this,'funkcja'), $parms);
  5. }
  6.  
  7. public function funkcja($matches)
  8. {
  9.  
  10. }

Robisz dalej co chcesz.
daniel1302
Nie stosowałem callbacka na taką skalę i nie wiedziałem o takiej opcji masz + oczywiście
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.