Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: str_replace lub cos podobnego
Forum PHP.pl > Forum > PHP
SHiP
Mam problem z wyrażeniami regularnymi ;] Za pomocą preg_mach_all odnajduje wszystkie ciągi do zmiany, nastepnie montuje pętelke i za pomocą str_replace podmieniam co się da. Wszystko działa pięknie dopuki nie mam do zamiany czegoś w stylu...

Kod
bla => cos tam
ble => cos tam 2
blacha => bardzo fajne
meble => po prostu extra


Co się dzieje... najpierw skrypt odnajduje i podmienia wszystkie bla tak więc z mojej blachy pozostaje
Kod
costamcha

Nastepnie podmienia wszystkie ble na cos tam i z moich mebli zostaje ;]
Kod
mecos tam 2

A niestety o coś takiego mi nie chodziło ;] Czy ktoś może zna sposób aby uniknąć tego typu akcji? Czy da się ograniczyć działanie funkjcji str_replace do jednej podmiany? Byłbym wdzięczny za jakiekolwiek wskazówki...
SHiP
Moj skrypt poczuł znaczny spadek szybkości ;].. jest moze jakas szybsza technika? Ja jeszcze spróbuję posortować tablice zwracaną przez preg_mach_all bo nie ma( i raczej nie bedzie) w niej wiecej niż 10 elementow wiec moze to bedzie szybsze rozwiązanie...
piczu
to moze wyszukuj nazwa => lub => nazwa?
SHiP
Cytat(piczu @ 25.07.2006, 17:12 ) *
to moze wyszukuj nazwa => lub => nazwa?

Nie rozumiem ;]

znalazłem rsort" title="Zobacz w manualu php" target="_manual Świetnie się tutaj nadaje i działa mi o ok. 0.0006s szybciej niż preg
Tylko nie wiem dlaczego jeśli mam tablice wielowymiarowa nie moge napisać
  1. <?php
  2. $nowa = rsors($moja[0]);
  3. ?>

php glupieje ;] musze tablice tymczasową tworzyc ;/
piczu
nadal nie wiem jak wyglada twoj kod, ale preg_match" title="Zobacz w manualu php" target="_manual wyszukuje do pierwszego pasujacego ciagu,
siemakuba
Możesz pokazać cały ten kod i napisać co i jak potrzebujesz zamieniać? Mam wrażenie, że strasznie nakombinowałes tam, a może da się to zrobić prościej i nie będzie problemu z wydajnością :)

pozdr.
SHiP
  1. <?php
  2. private function replaceVars($param) // funkcja wyszukuje i konwertuje zmienne w parametrach funkcji
  3. {
  4. if(strpos($param,'$')===false) return $param; // jesli nie ma zmiennych zwroc to co jest...
  5.  
  6. preg_match_all('#$([a-zA-Z0-9_]+)#is', $param, $vars);
  7. rsort($vars[1]);
  8.  
  9. for($i=0, $n=count($vars[1]); $i<$n; $i++)
  10. {
  11. /* ten kod obsluguje sekcje dla was nie ważne ;)
  12. $ln=strpos($vars[1][$i],'[');
  13. if($ln) $arrayName =substr($vars[1][$i],1,$ln); else $arrayName=$vars[1][$i];
  14. $sectionId = array_search($arrayName,$this -> section_name);
  15. if($sectionId) $param = str_replace('$'.$vars[1][$i],'$this -> vars[''.$vars[1][$i].''][$i'.$sectionId.']',$param);
  16. else */
  17.  
  18. $param = str_replace('$'.$vars[1][$i],'$this -> vars[''.$vars[1][$i].'']',$param);
  19.  
  20. }
  21. return $param;
  22. }
  23. ?>


Tak to działa... jako $param do funkcji przekazuje ciąg zawierający zmienne np...
Kod
bla bla $zmienna bla bla bla $zmie $z $zmien sdf


Teraz zamieniam to na
Kod
bla bla $this -> vars['zmienna'] bla bla bla $this -> vars['zmie'] $this -> vars['z'] $this -> vars['zmien'] sdf


Po więcej szczegółów zapraszam na Inny temat na php.pl winksmiley.jpg
siemakuba
Nie wiem na ile ważny jest ten kod, który oprócz str_replace działa sobie w pętli. Jeżeli będzie to dla ciebie OK, możesz sobie zamianę wartości wysatwić poza pętlę i zrobić tak:
  1. <?php
  2. $str = 'bla bla $zmienna bla bla bla $zmie $z $zmien $sdf';
  3. $str = preg_replace('/$([a-z0-9_]*)s?/si', '$this->vars["1"]', $str);
  4. ?>


pozdr.
SHiP
no wlasnie ten kod jest ważny... co do preg_replace jak juz wspomniałem działa dużo wolniej niz sortowanie tablicy więc chyba zostane przy tym kodzie króry mam... winksmiley.jpg

dzięki za odpowiedzi smile.gif
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.