[krótko] preg_split – multi explode
- Mateusz Żeromski | 2009-09-14 | Ciekawostki Optymalizacja Php
Rozwijając mój serwis pensje.net trafiłem na ciekawy problem. Otóż tworząc kreator raportów chciałem stworzyć funkcjonalność, która rozpoznaje czym są oddzielane wartości w wyszukiwaniu, np.: “programista php”, “programista,php”, “programista;php”. Ostatecznie chodziło o to aby wyciągnąć wartości “programista” oraz “php” i przeszukać tabelę pod ich kątem. Jako pierwsze rozwiązanie “explode” w pętli, lecz zanim zacząłem tworzyć poszukałem czegoś na wzór multi explode. Znalazłem funckję preg_split.
Czyli mają ciąg znaków
aaa bbbb, cccc ; dddd
Chcemy uzsykać tablicę
Array
(
[0] => aaa
[1] => bbbb
[2] => cccc
[3] => dddd
)
Wykonujemy więc procedurkę
1 2 3 4 5 6 7 | $data['job_position'] = preg_split('/(\s+|,|;)/', $data['job_position']); foreach($data['job_position'] as $k => $v){ if(empty($v)) unset($data['job_position'][$k]); } sort($data['job_position']); print_r($data['job_position']); |
Oczywiście za wszystko jest odpowiedzialne
1 | preg_split('/(\s+|,|;)/', $data['job_position']); |
Reszta kodu to czyszczenie z pustych zmiennych. Także jak widać można prosto zrobić multi explode i nie wymagać na użytkownikach używania jednego słusznego seperatora :)
Link do generatora raportów: http://pensje.net/raport/dodaj
Tagi: Ciekawostki, Krótko, Optymalizacja, php
1 tomaszsobczak 2009-09-14 16:09:44
używając preg_split w ten sposób
preg_split(’/(\s+|,|;)/’, $data['job_position'], -1, PREG_SPLIT_NO_EMPTY)
możesz sobie podarować kawałek
if(empty($v))
unset($data['job_position'][$k]);
a tym samym i całą pętle
$data['job_position'] = preg_split(’/(\s+|,|;)/’, $data['job_position'], -1, PREG_SPLIT_NO_EMPTY);
sort($data['job_position']);
print_r($data['job_position']);
2 Mateusz Żeromski 2009-09-14 16:36:47
ano tak – dzięki, niedoczytałem dokładnie dokumentacji :)
3 Adiasz 2009-09-18 11:09:36
Funkcja ciekawa, jednak imho troche nadmiarowa… te same rozdzielone dane mozna uzyskac stosujac preg_match_all(’#([regex])#ism’, $przeszukiwanyString, $wyniki); gdzie “regex” jest albo zakresem akceptowanych znakow (np. \pL), albo negacja zakresu znakow rozdzielenia (; etc…)
4 grzeiikg13 2010-01-10 17:50:06
htmlentities użyj, na początku nie rozumiałem >.