Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> preg_replace, zamiana z uzyciem wyrazen regularnych
dtb
post
Post #1





Grupa: Zarejestrowani
Postów: 476
Pomógł: 1
Dołączył: 5.11.2005
Skąd: Bieruń city

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


Mam kod:
  1. <?php
  2. $zmienna = preg_replace ('/([0-9]+)/', '$1', $zmienna); // dziala
  3. ?>

Jak widać kod zamiena w zmiennej '$zmienna' wszystkie cyfry na te same cyfry. Jednak chciałbym przepuścić te cyfry przez funkcje:
  1. <?php
  2. $zmienna = preg_replace ('/([0-9]+)/', funkcja('$1'), $zmienna); // blad
  3. $zmienna = preg_replace ('/([0-9]+)/', funkcja($1), $zmienna); // blad
  4. ?>

No właśnie. Błąd! Jak więc to zrobić?

Ten post edytował dtb 5.11.2005, 11:32:09


--------------------
Go to the top of the page
+Quote Post
L_Devil
post
Post #2





Grupa: Zarejestrowani
Postów: 195
Pomógł: 0
Dołączył: 13.04.2004
Skąd: Łódź

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


Niestety tak się nie da zrobić jak ty myślisz - do funkcji jako parametr wysyłasz po prostu zmienną $l, ewentualnie string "$l" - a nie to co produkuje wyrażenie regularne. Jeżeli już koniecznie chcesz żeby te liczby przeszły przez funkcję, musisz użyć eval" title="Zobacz w manualu php" target="_manual:

(w komentarzach podałem wartości zmiennej $ciag)

  1. <?php
  2.  
  3. function funkcja($int)
  4. {
  5.  return $int*$int;
  6. }
  7.  
  8. $ciag = "to prawda że 23 jest większe od 15?";
  9. /*
  10. to prawda że 23 jest większe od 15?
  11. */
  12.  
  13. $ciag = '"' . $ciag . '";';
  14. /*
  15. "to prawda że 23 jest większe od 15?";
  16. */
  17.  
  18. $ciag = preg_replace ('/([0-9]+)/', '" . funkcja($1); . "', $zmienna);
  19. /*
  20. "to prawda że" . funkcja(23) . "jest większe od " . funkcja(15) . "?";
  21. */
  22.  
  23. $ciag = '$ciag = ' . $ciag;
  24. /*
  25. $ciag = "to prawda że" . funkcja(23) . "jest większe od " . funkcja(15) . "?";
  26. */
  27.  
  28. eval($ciag);
  29. /*
  30. to prawda że 529 jest większe od 225?
  31. */
  32.  
  33. ?>
Czyli o to nam chodziło smile.gif

Ten post edytował L_Devil 5.11.2005, 12:14:13


--------------------
Językiem którym najlepiej operują wszyscy programiści są przekleństwa.
Go to the top of the page
+Quote Post
dtb
post
Post #3





Grupa: Zarejestrowani
Postów: 476
Pomógł: 1
Dołączył: 5.11.2005
Skąd: Bieruń city

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


Dzięki.
Uprościłem trochę twój kod:

  1. <?php
  2. function replace ($z, $na, $ciag)
  3. {
  4.     $ciag = '''.$ciag.'';';
  5.     $ciag = preg_replace ($z, $na, $ciag);
  6.     $ciag = '$ciag = '.$ciag;
  7.     eval ($ciag);
  8.     return $ciag;
  9. }
  10.  
  11. function repFun($fun)
  12. {
  13.     return ''.'.$fun.'.''
  14. }
  15.  
  16. $ciag = replace ('/([0-9]+)/', repFun(funkcja($1)), $ciag);
  17. ?>


Ten post edytował dtb 5.11.2005, 12:25:34


--------------------
Go to the top of the page
+Quote Post
legorek
post
Post #4





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


A po co takie kombinacje?

Zobacz czy to zadziała:
  1. <?php
  2. $zmienna = preg_replace ('/([0-9]+)/e', 'funkcja(1)', $zmienna);
  3. ?>


Kiedyś sam miałe z tym problem. Modyfikator /e - działa jak eval. Ale bądź ostrożny przy jego stsowaniu.

Ten post edytował legorek 5.11.2005, 14:08:45


--------------------
Go to the top of the page
+Quote Post
bela
post
Post #5


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


preg_replace_callback" title="Zobacz w manualu php" target="_manual ?


--------------------
Go to the top of the page
+Quote Post
dtb
post
Post #6





Grupa: Zarejestrowani
Postów: 476
Pomógł: 1
Dołączył: 5.11.2005
Skąd: Bieruń city

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


aha, dzieki.
mam jeszcze maly problem:
  1. <?php
  2. $this->text = preg_replace('/((['.$mods.']+){0,}'.$modList[$i].'(['.$mods.']+){0,})'.[B]$value[/B].'/', '($1$2)'.$this->dave($value), $this->text);
  3. ?>

wyskakuje mi blad, natomiast przy:
  1. <?php
  2. $this->text = preg_replace('/((['.$mods.']+){0,}'.$modList[$i].'(['.$mods.']+){0,})'.[b]'xxx'[/b].'/', '($1$2)'.$this->dave($value), $this->text);
  3. ?>

tego bledu nie ma. jak widac aoba kody roznia sie tylko tym ze zamiast $value wpisano 'xxx', a jednak w przykladzie 1 jest blad, mimo ze zmienna $value ma wartosc 'xxx', czyli teoretycznie powinno byc dobrze
Czemu tak jest i jak to rozwiazac?

Ten post edytował dtb 5.11.2005, 18:18:40


--------------------
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 Aktualny czas: 20.08.2025 - 11:08