Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Regex // Preg_Replace
Forum PHP.pl > Forum > Przedszkole
JakubBab
Hej,

Staram sie odszukac w tablicy , uzywajac Regex, slow ktore zawieraja wiecej niz 7 znakow a nastepnie zmodyfikowac je (maja byc z malej litery) i podmienic ze starymi uzywajac funkcji preg_replace.

Znajduje wyrazy ktore mnie interesuja ale po uruchomieniu funkcji preg_replace ,zmiana jest ale nie nie ta oczekiwana. Kod i opis dalszy ponizej :

  1. $wyrazenie_zlozone = array(" Serwer", " Router", " Klawiatura"," Mysz"," Karta sieciowa"," Monitor");


Tutaj kod w ktorym znajduje tego czego szukam( zamiescilem odrazu wywowalnie dla sprwadzenia)

  1. $pattern = '@([A-Za-z]{7,})@'; // szukam liter od [A-za- z] i z min. 7 znakami
  2.  
  3.  
  4.  
  5. $doZmiennej = array();
  6. $doZmiennej[]= $pattern;
  7.  
  8.  
  9. $pasujace = preg_grep($pattern,$wyrazenie_zlozone); // znajdz pattern w tablicy $wyrazenie_zlozone, przechowaj w $pasujace
  10. $pasujace1 = array_map('strtolower', $pasujace); // to co w pasujace1 zmniejsz 'lowercase'
  11. print_r ($pasujace1);
  12. echo "<br/>";

Funkcja wywoluje: Array ( [2] => klawiatura [4] => karta sieciowa [5] => monitor )

-------------------------------------------------------------------------------------------------------------------------------------------------
I teraz magia, po uruchomieniu funkcji preg_replace

  1. $zamiana = preg_replace($doZmiennej,$pasujace1,$wyrazenie_zlozone);
  2.  
  3.  
  4. print_r ($zamiana);




Wychodzi wynik taki :

Array ( [0] => Serwer [1] => Router [2] => klawiatura [3] => Mysz [4] => Karta klawiatura [5] => klawiatura )


ZAMIAST

Array ( [0] => Serwer [1] => Router [2] => klawiatura [3] => Mysz [4] => karta sieciowa [5] =>monitor )

Bede wdzieczny za sugestie.

Pozdr

Jakub.
KsaR
  1. $tablica = array(" Serwer", " Router", " Klawiatura"," Mysz"," Karta sieciowa"," Monitor");
  2. $tablica2=array();
  3. foreach ($tablica as $v)
  4. {
  5. if (isset($v[7]) && ctype_alnum(str_replace(' ','',$v))) # wiecej niz 7 i jest alfa numeryczne.
  6. {
  7. $tablica2[]=lcfirst($v); # więc dodajemy do $tablica2 oraz z malej 1szy znak.
  8. }
  9. }
  10. print_r($tablica2);

O cos takiego chodzilo?
--
Poprawilem, nie lapalo bo spacje byly.
JakubBab
Super, dziala. Zminilem tylko :

  1. $tablica2[]=strtolower($v); # więc dodajemy do $tablica2 oraz z malej wsztstko.


Dzieki za pomoc! cool.gif
com
po pierwsze twoje wyrażenie nie uwzględnia spacji, wiec pewnie wpisuje tam ostatni pasujący bo reszta pewnie nie ma 7 znaków
KsaR
Cytat(com @ 28.09.2015, 23:49:43 ) *
po pierwsze twoje wyrażenie nie uwzględnia spacji, wiec pewnie wpisuje tam ostatni pasujący bo reszta pewnie nie ma 7 znaków

biggrin.gif w moim to samo, chwile temu mi sie przypomnialo to poprawilem tongue.gif tzn. str_replace dodalem.
JakubBab
Super, dziala. Zminilem tylko :

  1. $tablica2[]=strtolower($v); # więc dodajemy do $tablica2 oraz z malej wsztstko.




Dzieki za pomoc! cool.gif


Ps. Respect za predkosc :] !

PS2. Niechesz pobawic sie w mentora?
com
do kogo to było biggrin.gif

Ksar teraz trochę przekombinowałeś i ctype nie jest chyba domyślny na większości serwerów
JakubBab
do Ksar :]

Com - rowniez dzieki za sugestie.
KsaR
Cytat(JakubBab @ 29.09.2015, 00:01:57 ) *
do Ksar :]

Com - rowniez dzieki za sugestie.

Gorszego mentora byś nie znalazł
( Temat: PHP Praca praktyki )
biggrin.gif acz kolwiek moge pomoc od czasu do czasu, o ile ogarne.
Jak co to priw tongue.gif
Pyton_000
  1. <?php
  2.  
  3. $wyrazenie_zlozone = array(" Serwer", " Router", " Klawiatura"," Mysz"," Karta sieciowa"," Monitor");
  4.  
  5. array_walk($wyrazenie_zlozone, function(&$value) {
  6. if(mb_strlen($value) > 7) {
  7. $value = strtolower($value);
  8. }
  9. });
  10.  
  11. var_dump($wyrazenie_zlozone);
com
albo twoim sposobem, z moja sugestią
http://ideone.com/ONGuJf

no i niepotrzebnie robiłeś tam preg_replace

ale rozwiązanie Pyton_000 wydaje się tu być najlepsze biggrin.gif
JakubBab
com - dziala i to jeszcze z REGEX - czapka z glowy smile.gif. Prosba o rozbicie teoretyczne ponizszego:


  1. $pattern = '@([A-Za-z]{7,}+[ ]{0,})@



Pyton - " fanks brah" - smile.gif



...i wyrywam sobie wlosy zadajac pod nosem pytanie - kiedy, no kiedy ja sie naucze i wyskocze jak ph34r.gif z gotowa odpowiedzia na podobny problem.
com
to trochę przekombinowałem biggrin.gif teraz widzę sam że jedynym błędem był twój preg_replace biggrin.gif patern był dobry smile.gif
KsaR
Cytat(com @ 29.09.2015, 00:24:08 ) *
albo twoim sposobem, z moja sugestią
http://ideone.com/ONGuJf

no i niepotrzebnie robiłeś tam preg_replace

ale rozwiązanie Pyton_000 wydaje się tu być najlepsze biggrin.gif

  1. <?php
  2. $start=microtime(1);
  3. for ($x=0;$x<10000;++$x)
  4. {
  5. $tablica = array(" Serwer", " Router", " Klawiatura"," Mysz"," Karta sieciowa"," Monitor");
  6. $tablica2=array();
  7. foreach ($tablica as $v)
  8. {
  9. if (isset($v[7]) && ctype_alnum(str_replace(' ','',$v))) # wiecej niz 7 i jest alfa numeryczne.
  10. {
  11. $tablica2[]=strtolower($v); # więc dodajemy do $tablica2 oraz z malej znaki.
  12. }
  13. else $tablica2[]=$v;
  14. }
  15. }
  16. echo 'Ksar: ',bcsub(microtime(1),$start,5),'<br/>';
  17. print_r($tablica2);
  18. echo '<br/><br/>';
  19. unset($v,$tablica,$tablica2,$start,$x);
  20.  
  21. $start=microtime(1);
  22. for ($x=0;$x<10000;++$x)
  23. {
  24. $wyrazenie_zlozone = array(" Serwer", " Router", " Klawiatura"," Mysz"," Karta sieciowa"," Monitor");
  25. array_walk($wyrazenie_zlozone, function(&$value)
  26. {
  27. if(mb_strlen($value) > 7)
  28. {
  29. $value = strtolower($value);
  30. }
  31. });
  32. }
  33. echo '<br/>Python_000: ',bcsub(microtime(1),$start,5),'<br/>';
  34. print_r($wyrazenie_zlozone);

Cytat
Ksar: 0.05350
Array ( [0] => Serwer [1] => Router [2] => klawiatura [3] => Mysz [4] => karta sieciowa [5] => monitor )


Python_000: 0.05680
Array ( [0] => Serwer [1] => Router [2] => klawiatura [3] => Mysz [4] => karta sieciowa [5] => monitor )

No niby mam szybsze o ile dobrze przetestowalem. (ps. Poprawilem z radami PW zeby dodawalo kazdy).
Dodatkowo Pyton_000 nie sprawdza czy alfa-numeryczne, ale jesli to zbedne? To u mnie tez mozna wywalic i znow jeszcze szybsze tongue.gif

--
A tu live wklejka gdzie skasowalem to sprawdzanie alfa-num:
http://ideone.com/o45lic
JakubBab
Tak jak ja sobie to tlumacze to:



  1. $pattern = '@([A-Za-z]{7,}+[ ]{0,})@


Szukaj wyrazenia ktore ma w sobie litery A-Za-z z minimalna liczba 7 znakow (+) i [] spacji {0,} <- a to to juz nie wiek jak zinterpretowac.

W kazdym razie, z mojego oryginalnego kodu zmienilem tylko:

  1. $zamiana = preg_replace($doZmiennej,$pasujace1,$wyrazenie_zlozone);


Na to:

  1. $zamiana = array_replace($wyrazenie_zlozone,$pasujace1);


I tez smiga.

Zachodze w glowe dlaczego preg_replace nie zadzialalo w tym przypadku. Anyone?

com
tak, napisałem to, że przekombinowałem biggrin.gif i nie zweryfikowałem potem a to nie robiło nic haha.gif zapomniałem że on pomija spacje biggrin.gif
http://www.php.net/preg_replace dlatego że, to na co miał zamienić miało być definicja schematu zamiany a nie było

Dla tak małej próbki to nie ma znaczenia, owszem rozwiązanie jest ok, ale jak wspomniałem jak na serwerze masz ctype, a pewnie nie masz. i wystarczy dać pare białych znaków i już warunek legnie, ale tego również rozwiania inne nie uwzględniają smile.gif
Pyton_000
Cytat(JakubBab @ 29.09.2015, 00:41:00 ) *
...i wyrywam sobie wlosy zadajac pod nosem pytanie - kiedy, no kiedy ja sie naucze i wyskocze jak ph34r.gif z gotowa odpowiedzia na podobny problem.


Jak będziesz miał 666 pomógł na profilu i 2000 like na FB ;D

Moje rozwiązanie nie zakładało tylko alfa-num bo nie było określonego konkretnego warunku, ale lekko modyfikując dodając warunki da się zrobić.

@KsaR może i szybsze ale przekombinowane wink.gif Poza tym ma komentarze, a jak ma komentarze to trzeba się zastanowić czy kod napisany nie powinien być zmieniony tak żeby się komentarzy pozbyć. (Temat komentarzy był na forum więc tam możemy podyskutować)


Suma sumarum Każde rozwiązanie jest dobre bardziej lub mniej wink.gif
com
Pyton_000 dobrze to ujął, w mojej wypowiedzi lepsze chodziło o to, że od razu widać co tu się dzieję, w twoim przykładzie trzeba się zastanawiać co miałeś na myśli wiec jak wspomniał Pyton_000 trzeba pomyśleć czy nie dało by sie tego napisać inaczej wink.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.