[krótko] preg_split – multi explode

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: , , ,

Komentarze: 4 do “[krótko] preg_split – multi explode”

  1. 1 tomaszsobczak

    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. 2 Mateusz Żeromski

    ano tak – dzięki, niedoczytałem dokładnie dokumentacji :)

  3. 3 Adiasz

    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. 4 grzeiikg13

    htmlentities użyj, na początku nie rozumiałem &gt.

Napisz komentarz