Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Regex // Preg_Replace
JakubBab
post 28.09.2015, 22:30:12
Post #1





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 17)
KsaR
post 28.09.2015, 22:39:20
Post #2





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


  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.

Ten post edytował KsaR 28.09.2015, 22:50:29


--------------------
Go to the top of the page
+Quote Post
JakubBab
post 28.09.2015, 22:45:21
Post #3





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


Super, dziala. Zminilem tylko :

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


Dzieki za pomoc! cool.gif

Ten post edytował JakubBab 28.09.2015, 22:54:00
Go to the top of the page
+Quote Post
com
post 28.09.2015, 22:49:43
Post #4





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


po pierwsze twoje wyrażenie nie uwzględnia spacji, wiec pewnie wpisuje tam ostatni pasujący bo reszta pewnie nie ma 7 znaków

Ten post edytował com 28.09.2015, 22:49:58
Go to the top of the page
+Quote Post
KsaR
post 28.09.2015, 22:51:35
Post #5





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


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.


--------------------
Go to the top of the page
+Quote Post
JakubBab
post 28.09.2015, 22:55:52
Post #6





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


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?

Ten post edytował JakubBab 28.09.2015, 22:57:13
Go to the top of the page
+Quote Post
com
post 28.09.2015, 22:57:59
Post #7





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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

Ten post edytował com 28.09.2015, 23:05:16
Go to the top of the page
+Quote Post
JakubBab
post 28.09.2015, 23:01:57
Post #8





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


do Ksar :]

Com - rowniez dzieki za sugestie.
Go to the top of the page
+Quote Post
KsaR
post 28.09.2015, 23:04:23
Post #9





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


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


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 28.09.2015, 23:05:48
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


  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);
Go to the top of the page
+Quote Post
com
post 28.09.2015, 23:24:08
Post #11





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
JakubBab
post 28.09.2015, 23:41:00
Post #12





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


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.
Go to the top of the page
+Quote Post
com
post 28.09.2015, 23:52:39
Post #13





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
KsaR
post 28.09.2015, 23:54:21
Post #14





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


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

Ten post edytował KsaR 29.09.2015, 00:03:40


--------------------
Go to the top of the page
+Quote Post
JakubBab
post 28.09.2015, 23:56:06
Post #15





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


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?

Go to the top of the page
+Quote Post
com
post 29.09.2015, 00:17:19
Post #16





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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

Ten post edytował com 29.09.2015, 00:19:52
Go to the top of the page
+Quote Post
Pyton_000
post 29.09.2015, 07:27:32
Post #17





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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
Go to the top of the page
+Quote Post
com
post 29.09.2015, 15:11:07
Post #18





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
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: 18.07.2025 - 04:40