Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Wyrażenie regularne i funkcja preg_replace
axwell
post
Post #1





Grupa: Zarejestrowani
Postów: 143
Pomógł: 1
Dołączył: 14.11.2007

Ostrzeżenie: (10%)
X----


Sprawa wygląda następująco....

mam ciąg tekstowy, założmy
Cytat
City View [by nikon]


w nawiasie kwadratowym może znajdować się wszelaki tekst. Chciałbym, aby ten cały nawias był odcinany, czyli w powyższym przypadku zostałby tekst "City View". Do tej pory robiłem to funkcją explode - dzieliłem tekst od znaku "[". Niestety rozwiązanie to nie jest już odpowiednie, dlatego proszę o pomoc w konstrukcji wyrażenie dla funkcji preg_replace
Go to the top of the page
+Quote Post
Pawel_W
post
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


nie powiem Ci jak ma wyglądać to wyrażenie w php, bo podawanie gotowców nie służy nauce smile.gif, ale postaram się wszystko w miarę jasno objaśnić

masz funkcję

przyjmuje ona 3 argumenty - wzór (ang. pattern), zamiennik oraz tekst do podmiany

Ty chcesz, żeby zamieniało wszystko co jest wewnątrz nawiasów [] razem z nimi, więc Twój wzór powinien wyglądać mniej-więcej tak:

[i tutaj dowolny ciąg znaków]

do skonstruowania takiego wyrażenia wystarczą całkowite podstawy, dlatego odsyłam do dobrego tutoriala smile.gif
http://pl.wikibooks.org/wiki/PHP/Podstawy_...%84_regularnych

Ten post edytował Pawel_W 30.03.2010, 07:41:23
Go to the top of the page
+Quote Post
axwell
post
Post #3





Grupa: Zarejestrowani
Postów: 143
Pomógł: 1
Dołączył: 14.11.2007

Ostrzeżenie: (10%)
X----


Powiem szcerze, że ten tutorial strasznie ubogi jest i początkującemu trundo jest to zrozumieć. Oczywiście wcześniej szukałem też innych objaśnień ale w sieci nie spotkałem dobrego poradnika po polsku. Więc kombinuje sam. Oto co próbowałem zrobić:


  1. $pattern = "[/[a-zA-Z\.\-\_]/]";
  2. $tekst = preg_replace($pattern,"",$tekst);


Niestety ten fragment kodu nie zmienia nic w tekście.

Ten post edytował axwell 30.03.2010, 15:28:55
Go to the top of the page
+Quote Post
blooregard
post
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Wywal te nawiasy kwadratowe z $pattern

//edit: ten pierwszy i ostatni


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
axwell
post
Post #5





Grupa: Zarejestrowani
Postów: 143
Pomógł: 1
Dołączył: 14.11.2007

Ostrzeżenie: (10%)
X----


  1. tekst = "City View [by nikon]";
  2. $pattern = "/[a-zA-Z\.\-\_]/";
  3. $tekst = preg_replace($pattern,"test",$tekst);


na razie ustawiłem sobie żeby zamieniało to na 1 zebym widział jak to chodzi. No i jest pewien postęp, wynik to:

Cytat
1111 1111 [11 11111]


Domyślam się, że musze do $pattern dodać informację, że przed nawiasem jeszce występuje tekst. Jak połączyć to z tym co już mam? Próbowałem znakiem + tak jak w tutorialu ale PHP pokazuje błąd "Unknown modifier '+' "
Go to the top of the page
+Quote Post
piotrooo89
post
Post #6


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




escapuj znaki [ i ] /\[a-zA-Z\.\-\_\]/.


--------------------
Go to the top of the page
+Quote Post
Pawel_W
post
Post #7





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


Cytat(piotrooo89 @ 30.03.2010, 20:39:19 ) *
escapuj znaki [ i ] /\[a-zA-Z\.\-\_\]/.

yy, w tym wypadku [ ] oznacza klasę znaków a nie znak [ lub ], dlatego się go nie escapuje...

co do patternu to nie ustalasz nigdzie długości ciągu
Go to the top of the page
+Quote Post
piotrooo89
post
Post #8


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




Cytat(Pawel_W @ 30.03.2010, 20:42:08 ) *
yy, w tym wypadku [ ] oznacza klasę znaków a nie znak [ lub ], dlatego się go nie escapuje...


wiec co oznaczają te nawiasy, w takim razie powiedz mi jak byś kazał temu regexpowi wyciągnąć coś co ma pomiędzy [ i ] bez zdefiniowania ich.

aha i ja bym robił coś w stylu: /\[.*\]/

edit.

można też pomyśleć o zachłanności tego wyrażenia.
Powód edycji: [piotrooo89]:


--------------------
Go to the top of the page
+Quote Post
rel
post
Post #9





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 9.01.2014

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


Wszystko ładnie pięknie, ale co zrobić w momencie, gdy np z takiego linku:

Kod
http://oglaszajtu.pl/ogloszenia/54/Dom Wieruszów, pow. 150m2


chcę usunąć "," i "." no i do tego spację zamienić na "-"

A od poczatku to tak:

1. Generuję sobie plik .xml kodem:

  1. <?php
  2. function lacz_bd()
  3. {
  4. $db = new mysqli('localhost', '_admin', 'pass', 'baza');
  5. if (! $db)
  6. return false;
  7. $db->autocommit(TRUE);
  8. return $db;
  9. }
  10. // dane do ramy pliku .xml
  11. $kanalRSS = '<?xml version="1.0" encoding="ISO-8859-2"?>';
  12. $kanalRSS .= '<trovit>';
  13. $kanalRSS .= '<ad>';
  14.  
  15. // połaczenie z bazą danych
  16. $db = lacz_bd();
  17. //zapytanie określające dane ktore powinny byc pobrane z tabeli
  18. // teraz pobierzmy wszystkie dane spelniajace warunek category_id=140
  19. $zapytanie = "SELECT * FROM announcements WHERE category_id in (140,141,142,143,144)";
  20. $wynik = $db->query($zapytanie);
  21. $ile_znalezionych = $wynik->num_rows;
  22. for ($i=0; $i <$ile_znalezionych; $i++)
  23. {
  24. $wiersz = $wynik->fetch_assoc();
  25.  
  26. //usuwamy znaczniki html ze wszystkich danych z tabeli
  27. $wiersz['annoucement_content'] = strip_tags($wiersz['annoucement_content']);
  28. $string = $wiersz['annoucement_title'];
  29. $pattern = '/ /';
  30. $replacement = '-';
  31. $wiersz['annoucement_title'] = preg_replace($pattern, $replacement, $string);
  32.  
  33. //tutaj generujemy zawartosc pliku .xml, ktora pobierana jest z tabeli announcements
  34. $kanalRSS .= '<item>';
  35. $kanalRSS .= '<id><![CDATA['.$wiersz['annoucement_id'].']]></id>';
  36. $kanalRSS .= '<url><![CDATA[http://oglaszajtu.pl/ogloszenia/'.$wiersz['annoucement_id'].'/'.$wiersz['annoucement_title'].']]></url>';
  37. $kanalRSS .= '<title><![CDATA['.$string.']]></title>';
  38. $kanalRSS .= '<type><![CDATA['.$wiersz['annoucement_type'].']]></type>';
  39. $kanalRSS .= '<content><![CDATA['.$wiersz['annoucement_content'].']]></content>';
  40. $kanalRSS .= '<date><![CDATA['.$wiersz['annoucement_date_added'].']]></date>';
  41. $kanalRSS .= '</item>';
  42. }
  43. $kanalRSS .= ' </ad>';
  44. $kanalRSS .= '</trovit>';
  45.  
  46. //Zapisujemy wygenerowany kod XML do pliku moj_rss.xml
  47. $fp = fopen('trovit_oglaszajtu.xml','w');
  48. fwrite($fp,$kanalRSS);
  49. fclose($fp);
  50. ?>


spacje zamieniłem już na "-" ale pozostaje sprawa wywalenia "," i ".".
Podpowie ktoś w którą stronę spojrzeć? bo próbowałem tak jak w manualu pokazują array(), ale wywala mi bład.

jak widać tutaj
Kod
$kanalRSS .= '<url><![CDATA[http://oglaszajtu.pl/ogloszenia/'.$wiersz['annoucement_id'].'/'.$wiersz['annoucement_title'].']]></url>';
    $kanalRSS .= '<title><![CDATA['.$string.']]></title>';


dałem dwie $, które sa niemal tym samym, tyle tylko, że musiałem to tak zagmatwać, gdyż w linku ma usuwać pewne znaki i zamieniać, zas poniżej w title ma je zostawiać, a innego rozwiaznaia nie znalazłem/wymyśliłem.
A i jeszcze sprawa zamiany dużych liter na małe

  1. <?php
  2. //.....
  3. //usuwamy znaczniki html ze wszystkich danych z tabeli
  4. $wiersz['annoucement_content'] = strip_tags($wiersz['annoucement_content']);
  5. $string = $wiersz['annoucement_title'];
  6.  
  7. $pattern = array();
  8. $pattern[0] = '/ /';
  9. $pattern[1] = '/,/';
  10. $pattern[2] = '/./';
  11. $replacement = array();
  12. $replacement[2] = '-';
  13. $replacement[1] = '';
  14. $replacement[0] = '';
  15. $wiersz['annoucement_title'] = preg_replace($pattern, $replacement, $string);
  16.  
  17. ?>


taki kodzik nie daje efektu, mało tego usuwa mi końcówkę adresu/urla.

Ten post edytował rel 11.02.2014, 13:40:54
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jesli okreslasz konkretne znaki jaki chcesz zamieniac, to nie mieszaj do tego preg_replace, tylko poprostu str_replace.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rel
post
Post #11





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 9.01.2014

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


Jak zwykle nospor niezawodny, str_replace wywaliło co trzeba i zamieniło również. pozostają wielki elitery, które też mi tutaj zawadzają, jakiś pomysł na to?
Jestem u końca roboty, która jak dotąd była dla mnie czymś niedoścignionym :-)



Ten post edytował rel 11.02.2014, 14:42:20
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Manual tez jest niezawodny
http://pl1.php.net/manual/en/function.strtolower.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rel
post
Post #13





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 9.01.2014

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


Cytat(nospor @ 11.02.2014, 14:44:12 ) *


No tak tylko jak to wszystko połączyć? Tzn string_tags, str_replace i do tego strtolower?
i czy polskie znaki tutaj moge też usunąć za pomoca str_replace podczas usuwania spacji i , oraz .?

Ten post edytował rel 11.02.2014, 14:52:44
Go to the top of the page
+Quote Post
Turson
post
Post #14





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jak nie wiesz jak ro rób po kolei
$string = str_replace..
$string = strtolower($string)
$string = strip_tags($string)
Go to the top of the page
+Quote Post
rel
post
Post #15





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 9.01.2014

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


Cytat(Turson @ 11.02.2014, 14:53:33 ) *
Jak nie wiesz jak ro rób po kolei
$string = str_replace..
$string = strtolower($string)
$string = strip_tags($string)


No tak, tylko skąd mam wiedzieć, która funkcja ma być na poczatku? Brać to jakoś na logikę czy sa określone lub nie zasady?
Go to the top of the page
+Quote Post
Turson
post
Post #16





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Najłatwiej uczyc się metodą prób i błędów smile.gif
Go to the top of the page
+Quote Post
rel
post
Post #17





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 9.01.2014

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


  1. <?php//usuwam znaczniki html ze wszystkich danych z tabeli, polskie znaki, duze litery
  2. $wiersz['annoucement_content'] = strip_tags($wiersz['annoucement_content']);
  3. $wiersz['annoucement_title'] = strtolower($wiersz['annoucement_title']);
  4. $string = $wiersz['annoucement_title'];
  5. $pattern = array(' ', ',', '.', 'ą', 'Ą', 'ć', 'Ć', 'ę', 'Ę', 'ł', 'Ł', 'ń', 'Ń', 'ó', 'Ó', 'ś', 'Ś', 'ź', 'Ź', 'ż', 'Ż');
  6. $replacement = array('-', '', '', 'a', 'A', 'c', 'C', 'e', 'E', 'l', 'L', 'n', 'N', 'o', 'O', 's', 'S', 'z', 'Z', 'z', 'Z');
  7. $wiersz['annoucement_title'] = str_replace($pattern, $replacement, $string);
  8. ?>


1. Spacje zamienia na "-" ok.
2. Usuwa "," i "." ok.
3. Duże na małe zamienia - ok
4. Nie zamienia pl znaków na en - not ok :-(

ktoś podpowie gdzie leży problem?

Ten post edytował rel 12.02.2014, 08:39:56
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 - 08:43