Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Preg_match czy lepiej explode?
Forum PHP.pl > Forum > PHP
cros
Mam do wyciagniecia pewne dane ze zrodla strony i zastanawiam sie ktora metoda preg_match(), czy explode() bedzie w tym przypadku lepsza-wydajniejsza-latwiejsza.
Chodzi o to ze preg_match() malo znam i ciezko mi napisac wlasny wzorzec dla niego, a do tego zrodlo tej strony jest zmienne, tzn dane ktore chce wyciagnac sie zmieniaja, nie zmienia sie za to wszystko to co jest przed i po tych danych (znaczniki html i ich id), wiec wydaje mi sie ze explode() byloby tu lepsze.
Co o tym sadzicie?

Przykladowe zrodlo pisane odrecznie winksmiley.jpg
Kod
<table id="tabelka">
<tr><td>Imie: Piotr</td>
<td>Nazwisko: Nowak</td>
<td> Wiek: 99l.</td>
<td>Miasto: Lodz</td></tr></table>

to przykladowy kod zrodla strony, oczywiscie dane sa zmienne, w zaleznosci jakie zapytanie pierw wysle do tej strony i jakie zrodlo ona mi zwroci.
Niezmienne sa za to znaczniki html <table><td> itp. dzieki ktorym moge uzyc:
Kod
$dane[] = explode("<tr><td>Imie: ", $zrodlo);

w ten sposob moge wyodrebnic imie, nazwisko itp. ale ta metoda jest troche na zlamanie karku, preg_match() (o ile moze) bylby tu bardziej wskazany jak sadze, ale jaki wzorzec napisac zeby wyodrebnic samo imie,nazw,wiek,miasto z tego przykladu? Da sie w ogole, skoro te dane sa zmeinne?
Teraz imie=piotr, ale w nastepnym zapytaniu moze byc imie=grzegorz i co wtedy?
Odrazu mowie ze preg_match() dla mnie to magia winksmiley.jpg
Nie przykladalem sie do poznania tej funkcji i do nauki tworzenia wzorcow dla niej, bo jak patrze na te krzaczki to boli mnie glowa winksmiley.jpg
darko
preg_match jest szybsze, ale samym preg_match danych nie wyciągniesz, tylko wyszukasz coś co pasuje do wzorca, poza tym jaki problem napisać odpowiedni wzorzec dla wyszukiwania danych na początku i na końcu łańcucha? poczytaj o meta znacznikach tutaj: http://www.php.net/manual/pl/regexp.reference.meta.php
cros
Cytat(darko @ 9.11.2009, 14:37:38 ) *
preg_match jest szybsze, ale samym preg_match danych nie wyciągniesz, tylko wyszukasz coś co pasuje do wzorca, poza tym jaki problem napisać odpowiedni wzorzec dla wyszukiwania danych na początku i na końcu łańcucha? poczytaj o meta znacznikach tutaj: http://www.php.net/manual/pl/regexp.reference.meta.php


Ok znalazlem wzorzez i zaadaptowalem go do wlasnych potrzeb
Kod
preg_match_all('[<tr><td>Imie: (.+?)<\/td>]', $zrodlo, $imie);
preg_match_all('[<td>Nazwisko: (.+?)<\/td>]', $zrodlo, $nazwisko);
.....itd....
$imie = $imie[1][0];
$nazwisko = $imie[1][0]; // najlepiej uzyc print_r($nazwisko); zeby sprawdzic w ktorych rekordach jest interesujaca nas zmienna
....itd...

Ten kod dot. przykladowego zrodla, ktore podalem w 1 poscie, moze komus sie przyda :]
Jednak jest to proste i lepsze od explode() winksmiley.jpg


EDIT: Jedyna wada tego jest to, ze gdy wartosc ktora wyciagamy ma w sobie zalamania tekstu (<\ br>, \n, itp), wtedy preg_match nic nie zwraca, nie wiem czemu i jak to obejsc, moze ktos z was zna przyczyne, bo na moj gust to chodzi o te slashe, czy tam backslashe "\"
Pro
ded
bowalem zrodlo pierw przekonwertowac poprzez stripslashes - nic nie dalo...
Jesli nie uda mi sie z tym cos zrobic, to ta jedna zmienna wyciagne poprzez explode i bedzie dobrze smile.gif
Fifi209
Cytat(darko @ 9.11.2009, 14:37:38 ) *
preg_match jest szybsze

Aha, możesz dopowiedzieć coś w tym temacie? Najchętniej obejrzę testy wydajności obu.

Cytat(darko @ 9.11.2009, 14:37:38 ) *
, ale samym preg_match danych nie wyciągniesz, tylko wyszukasz coś co pasuje do wzorca

Jeżeli dasz odpowiedni parametr dla preg_match to dostaniesz tablicę wszystkiego co pasuje dla danego wyrażenia.

@topic
Najlepiej pokaż ze znacznikami html'a co chcesz wyciągnąć w odpowiednim bb-code to pokażemy jak to zrobić.
darko
fifi209, proszę bardzo:

http://www.mail-archive.com/php-general@li...t/msg19776.html

oczywiście wszystko zależy od typu operacji jakie chcemy wykonać...
Fifi209
Cytat(darko @ 9.11.2009, 22:51:42 ) *
fifi209, proszę bardzo:

http://www.mail-archive.com/php-general@li...t/msg19776.html

oczywiście wszystko zależy od typu operacji jakie chcemy wykonać...


Cytat
preg_split
Timer: This page was generated in 0.23138296604156 seconds.

split
Timer: This page was generated in 0.22009003162384 seconds.

explode
Timer: This page was generated in 0.14973497390747 seconds.


Hmm, jak dla mnie jednak explode jest szybsze, no ale zależy jak patrzeć. Może na oczy mi się rzuciło.
darko
uff! no tak rozmawiamy o preg_match i explode a nie o eregi (!) sciana.gif

w tej sytuacji tylko stopka mnie ratuje...

fifi209 masz rację, przyznaję 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.