Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenie regularne i funkcja preg_replace
Forum PHP.pl > Forum > Przedszkole
axwell
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
Pawel_W
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
axwell
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.
blooregard
Wywal te nawiasy kwadratowe z $pattern

//edit: ten pierwszy i ostatni
axwell
  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 '+' "
piotrooo89
escapuj znaki [ i ] /\[a-zA-Z\.\-\_\]/.
Pawel_W
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
piotrooo89
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.
rel
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.
nospor
Jesli okreslasz konkretne znaki jaki chcesz zamieniac, to nie mieszaj do tego preg_replace, tylko poprostu str_replace.
rel
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 :-)

nospor
Manual tez jest niezawodny
http://pl1.php.net/manual/en/function.strtolower.php
rel
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 .?
Turson
Jak nie wiesz jak ro rób po kolei
$string = str_replace..
$string = strtolower($string)
$string = strip_tags($string)
rel
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?
Turson
Najłatwiej uczyc się metodą prób i błędów smile.gif
rel
  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?
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.