Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Podmiana tekstu na zmienną
daniel1302
post 27.08.2009, 18:23:14
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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
Go to the top of the page
+Quote Post
wookieb
post 27.08.2009, 18:25:43
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 27.08.2009, 18:30:18


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 27.08.2009, 18:29:10
Post #3





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


O co chodzi z tym

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

Go to the top of the page
+Quote Post
wookieb
post 27.08.2009, 18:31:53
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Jeden mądrala darł się o podstawach ale już usunął post.


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 27.08.2009, 18:49:04
Post #5





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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:
Go to the top of the page
+Quote Post
wookieb
post 27.08.2009, 18:52:45
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




przeciez funkcja nie ma dostepu do $table... Wiec musisz dodac w srodek
  1. global $table;


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 27.08.2009, 18:54:40
Post #7





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Właśnie zauważyłem, ale za późno dzięki masz 2 plusy
Go to the top of the page
+Quote Post
thek
post 27.08.2009, 23:17:04
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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

Ten post edytował thek 27.08.2009, 23:18:59


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Fifi209
post 27.08.2009, 23:39:46
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


A od czego jest sprintf ?

  1. $test = 'Mam na imie: %s, a moje nazwisko to: %s';
  2.  
  3. echo sprintf($test, 'Jan', 'Kowalski');


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
daniel1302
post 28.08.2009, 07:33:06
Post #10





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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?
Go to the top of the page
+Quote Post
thek
post 28.08.2009, 09:14:34
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
daniel1302
post 28.08.2009, 17:27:25
Post #12





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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?
Go to the top of the page
+Quote Post
wookieb
post 28.08.2009, 17:32:29
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 28.08.2009, 18:55:52
Post #14





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Nie stosowałem callbacka na taką skalę i nie wiedziałem o takiej opcji masz + oczywiście
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: 14.08.2025 - 08:52