1. Ograniczniki - /
Każde wyrażenie regularne powinno zostać objęte w ogranicznik na początku i końcu wyrażenia. Takim ogranicznikiem zazwyczaj jest slash ( / ), ale może to być również inny znak. Przyjęło się jednak, że jako ogranicznik stosujemy / i tego się trzymajmy. Proste wyrażenie regularne może mieć więc następującą postać:
- /kot/
gdzie kot to wzorzec dopasowania, a / na początku i końcu to ograniczniki. Wyrażenie takie pasować będzie do każdego ciągu tekstowego, w którym występować będzie słowo kot.
Pasować będzie do wszystkich trzech poniższych ciągów:
- Ala ma kota.
- Ala ma kota i Ola ma kota.
- kot ma na imię Mruczek
- Te koty mają po 4 lata.
Nie ma znaczenia, czy ciąg kot występuje tutaj na początku, na końcu, czy w środku badanego ciągu tekstowego oraz ile razy wystąpi, ma jednak znaczenie wielkość liter. Powyższe wyrażenie nie dopasuje się już więc do ciągu:
- Kot jest szary.
W powyższym zdaniu Kot != kot.
Zachowanie funkcji dopasowującej możemy zmienić za pomocą dodatkowych parametrów, tak aby ignorowała wielkość liter i dopasowała słowo kot zarówno do kot, Kot, jak i KoT, ale o tym w kolejnej części.
2. Zaczepienia końca i początku ciągu - ^ i $
Jak zauważyliśmy wyżej - wyrażenie /kot/ pasuje do każdego ciągu tekstowego, w którym występuje słowo kot, niezależnie w którym miejscu ciągu to słowo wystąpi i nie ważne, czy wystąpi jako pojedyńcze słowo kot, czy też jako część innego słowa, jak np.:
- Ala jest markotna.
Powyższy ciąg zostanie dopasowany.
Aby teraz określić, że słowo kot musi wystąpić dokładnie na początku, lub na końcu ciągu stosujemy ograniczniki początku i końca, tzw. zaczepienia lub kotwice:
- ^ - oznacza początek ciągu
- $ - oznacza koniec ciągu
Jeśli zmienimy teraz nasze wyrażenie na:
- /^kot/
będzie ono pasować jedynie do ciągów, w których słowo kot występuje na samym początku ciągu, a więc np. do:
- kot jest szary
- kot jest gruby
Nie będzie natomiast już pasować do ciągu:
- Ten kot jest szary.
Analogicznie z zaczepieniem końca ciągu - $. Wyrażenie:
- /kot$/
będzie nam pasować do ciągów:
- To jest kot
- Tam jest czarny kot
Nie dopasuje się już jednak do:
- Ten kot jest niegrzeczny.
Obie kotwice mogą też wystąpić wspólnie i tak np. wyrażenie:
- /^kot$/
dopasuje się tylko i wyłącznie do ciągu:
- kot
Zaczepienia początku i końca ciągu, czyli ^ i $ są najczęściej używanymi zaczepieniami.
Takich kotwic jest więcej, ale opiszemy je sobie w kolejnej części.
3. Funkcja sprawdzająca - preg_match()
W języku PHP do sprawdzenia dopasowania służy funkcja:
- $wynik = preg_match(wyrazenie_regularne, badany_ciag);
Zwraca ona wartość 1, jeśli wyrażenie zostanie dopasowane do badanego ciągu, lub 0, jeśli takie dopasowanie nie wystąpi. I tak na przykład:
- $w = preg_match('/kot/', 'Ala ma kota');
zwróci wartość 1, gdyż dopasowanie wystąpi, natomiast wywołanie:
- $w = preg_match('/^kot/', 'Ala ma kota');
zwróci nam 0, gdyż dopasowanie nie wystąpi.
Będziemy się tutaj dalej posługiwać m.in. takim zapisem, gdyż jest on chyba czytelniejszy dla oka.
4. Dowolny znak - kropka ( . )
W wyrażeniach regularnych występuje kilka znaków o specjalnym znaczeniu. Jednym z nich jest kropka ( . ). Kropka oznacza dowolny znak w ciągu. Przyjrzyjmy się poniższym dopasowaniom:
- $w = preg_match('/k.t/', 'Ala ma kota');
- $w = preg_match('/k.t/', 'To jest katalog');
- $w = preg_match('/k.t/', 'Bez kitu');
We wszystkich trzech przypadkach dopasowanie wystąpi, gdyż zapis:
- k.t
pasuje do każdego 3-literowego ciągu, w którym początkowym znakiem jest k, końcowym t, a środkowym każdy inny, dowolny znak. Należy jednak pamiętać, iż w tym przypadku kropka oznacza jedynie JEDEN dowolny znak, poniższe zatem już się nam nie dopasuje:
- $w = preg_match('/k.t/', 'To jest rakieta');
Powód niedopasowania: w słowie rakieta pomiędzy literami k i t mamy dwa znaki - i e.
A jak teraz sprawdzić, czy w badanym ciągu występuje znak kropki, skoro kropka oznacza dowolny znak?
Otóż w takim przypadku znak kropki poprzedzić musimy backslashem ( \ ). Na przykład:
- $w = preg_match('/k\.t/', 'to jest byk.to jest krowa.');
Wyrażenie takie zostanie dopasowane, gdyż szukamy dopasowania dla ciągu k.t - kropka poprzedzona backslashem traci swoje specjalne znaczenie i staje się zwykłą kropką.
5. Znaki specjalne
Nie tylko znak kropki ma specjalne znaczenie w wyrażeniu regularnym. Takich znaków jest kilka i za każdym razem, gdy chcemy pozbawić taki znak swojego specjalnego znaczenia i użyć go jako zwykłego znaku to musimy poprzedzić go znakiem backslash ( \ ). Lista znaków specjalnych znajduje się poniżej:
- \ . * + ? [ ^ $ | { ( )
Znakiem specjalnym jest też wykorzystany ogranicznik, czyli zazwyczaj /.
Poszczególne znaki specjane oraz ich zastosowanie omówimy sobie dokładnie w kolejnych akapitach.
6. Zbiory znaków - nawias kwadratowy [ ]
W wyrażeniu podać możemy zamiast pojedyńczego znaku cały zbiór znaków, np. zbiór wszystkich lub tylko zadanych liter, lub cyfr. Zbiory znaków podajemy w nawiasach kwadratowych [ ]. Przyjrzyjmy się teraz dwóm przykładom:
- $w = preg_match('/kot/', 'To jest kot');
Wyrażenie /kot/ zostanie tutaj dopasowane do ciągu To jest kot.
Zobaczmy teraz wyrażenie, w którym podamy zbiór znaków:
- $w = preg_match('/[pies]/', 'To jest kot');
Wyrażenie takie również zostanie dopasowane. Dlaczego? Otóż zapis:
- [pies]
oznacza zbiór znaków: p, i, e, s, a więc zbiór 4 liter, z których wystąpić musi dokładnie JEDNA, obojętnie która.
W naszym przypadku, w ciągu:
- To jest kot
występuje litera e, oraz litera s, zatem zbiór znaków w którym występuje e i s zostanie do takiego ciągu dopasowany.
Zbiory znaków możemy łączyć ze zwykłymi znakami z poza zbioru, np.:
- ab[XYZ]cd
pasować będzie do wszystkich trzech poniższych ciągów:
- abXcd
- abYcd
- abZcd
7. Zakresy znaków w zbiorach - [a-z]
W wyrażeniach regularnych podawać możemy zakresy znaków - np. wszystkie litery, lub wszystkie cyfry. Zakres znaków podajemy za pomocą myślnika ( - ), zapis taki jak poniżej:
- [a-z]
oznaczać będzie wszystkie małe litery od a do z. Popatrzmy teraz na przykład:
- ab[a-z]cd
Powyższe wyrażenie zostanie dopasowane do wszystkich poniższych ciągów:
- abacd
- abbcd
- abccd
- abxcd
- abycd
- abzcd
Stanie się tak dlatego, gdyż zbiór [a-z] oznacza dowolny jeden znak ze zbioru liter od a do z.
Możemy tworzyć swoje własne zbiory, np. zapis [a-f] oznaczać będzie dowolny znak ze zbioru liter od a do f.
Istnieje kilka standardowych zakresów, których używać będziemy bardzo często w swoich wyrażeniach:
- [a-z] - oznacza dowolną literę od a do z
- [A-Z] - oznacza dowolną literę od A do Z, czyli to samo co powyżej, ale dla wielkich liter
- [0-9] - oznacza dowolną cyfrę
Zakresów znaków możemy w zbiorze podać kilka, np.:
- ab[a-zA-Z0-9]cd
pasować będzie do wszystkich poniższych ciągów:
- abacd
- abBcd
- ab0cd
- abXcd
- ab2cd
- ab5cd
8. Dopełnienie zbioru - ^
Jak pamiętamy z początku artykułu, znak karety ( ^ ) oznacza początek badanego ciągu. Znak ten ma jednak inne znaczenie jeśli zastosujemy go wewnętrz zbioru znaków, czyli pomiędzy nawiasami kwadratowymi. Oznacza on w takim przypadku negację zbioru, czyli jego zaprzeczenie. Spójrzmy na poniższy zapis:
- [^a-z]
Zapis taki oznacza zbiór znaków, w którym nie może wystąpić żadna mała litera od a do z.
Znak ^ podajemy przed podaniem danego zakresu lub znaku, którego będzie dotyczyć, na samym początku w dopełnianym zbiorze. Spójrzmy na przykład:
- $w = preg_match('/abc[^a-z]/', 'abcdef');
Wyrażenie to nie zostanie dopasowane, gdyż po ciągu abc nie może wystąpić żaden znak z zakresu od a do z.
Wyrażenie za to dopasuje się do:
- $w = preg_match('/abc[^a-z]/', 'abc123');
gdyż tutaj po abc występują cyfry, nie występuje żaden znak z zakresu od a do z.
9. Klasy znaków - \w, \d, \s, POSIX
Jako, iż zakresy znaków takie jak litery A-Z, czy cyfry 0-9 są dość często używane w wyrażeniach regularnych - istnieją skrócone wersje zapisu zakresu znaków.Lista skróconych zapisów:
- \w - oznacza wszystkie litery, cyfry i podkreślnik - [a-zA-Z0-9_]
- \W - stanowi negację \w - [^a-zA-Z0-9_]
- \d - oznacza wszystkie cyfry - [0-9]
- \D - stanowi negację \d - [^0-9]
- \s - oznacza znaki specjalne - spację, \n, \r\ i \t
- \S - stanowi negację \s
Stosowanie takiego zapisu niczym nie różni się od podawania zakresu w nawiasach kwadratowych, przykład:
- $w = preg_match('/abc[^0-9]/', 'abc123');
jest równoważny z:
- $w = preg_match('/abc\D/', 'abc123');
Zapis POSIX-owy
Wybrane zakresy można również zapisać w standardzie POSIX.
Lista zakresów znajduje się poniżej:
- [:alnum:] - oznacza wszystkie litery i znaki
- [:alpha:] - oznacza litery
- [:blank:] - oznacza spację lub znak tabulacji
- [:cntrl:] - oznacza znaki sterujące
- [:digit:] - oznacza cyfry
- [:graph:] - oznacza znaki drukowalne bez odstępu
- [:lower:] - oznacza jedynie małe litery
- [:print:] - oznacza znaki drukowalne ze znakiem odstępu
- [:punct:] - oznacza znaki drukowalne za wyjątkiem liter i cyfr
- [:space:] - oznacza spacje
- [:upper:] - oznacza jedynie duże litery
- [:xdigit:] - oznacza cyfry w zapisie szesnastkowym
Przykładowy zapis POSIX-owy:
- $w = preg_match('/abc[^[:digit:]]/', 'abc123');
równoważny jest z:
- $w = preg_match('/abc[^0-9]/', 'abc123');
co oznacza oczywiście, że po ciągu abc musi wystąpić znak różny od cyfry.
10. Alternatywa - lub - znak |
W wyrażeniu regularnym możemy podać alternatywę, czyli logiczne OR. Dopasowany będzie wtedy któryś z ciągów rozgraniczonych znakiem ( | ). Aby to zobrazować spójrzmy na dwa przykłady:
- $w = preg_match('/kot|pies/', 'To jest kot');
- $w = preg_match('/kot|pies/', 'To jest pies');
W obu powyższych przykładach istnieje dopasowanie, gdyż dopasowywany jest albo ciąg kot, albo ciąg pies.
Alternatywa operuje na całości członu znajdującego się po lewej lub po prawej stronie znaku |.
Jeśli więc stworzymy takie wyrażenie:
- $w = preg_match('/.kot|pies./', 'To jest kot');
Będzie ono dopasowywane na zasadzie:
- /.kot/
lub
- /pies./
11. Grupowanie - nawiasy okrągłe - ( )
Grupowanie za pomocą nawiasów okrągłych () ma takie samo zastosowanie jak w matematyce podczas grupowania działań. Jest to bardzo często wykorzystywana funkcja, szczególnie podczas używania znaku alternatywy, gdzie określić musimy dokładnie jakiej części wyrażenia dotyczy alternatywa. Spójrzmy na przykład z poprzedniego akapitu:
- $w = preg_match('/.kot|pies./', 'To jest kot');
W powyższym przypadku dopasowujemy albo wyrażenie /.kot/ albo wyrażenie /pies./.
Jeśli jednak chcemy, aby alternatywa dotyczyła jedynie słów kot i pies (bez uwzględniania kropek) to użyjemy nawiasu grupującego:
- $w = preg_match('/.(kot)|(pies)./', 'To jest kot');
W tym przypadku dopasowywane jest wyrażenie:
- /.(kot)|(pies)./
gdzie wystąpić musi na początku i na końcu ciągu dowolny znak, w środku natomiast wystąpić musi ciąg kot lub pies.
Nawiasy mają jeszcze jedno zastosowanie, ale o tym napiszemy sobie za chwilę.
12. Kwantyfikatory - *, +, ?, { }
W poprzednich akapitach stosowaliiśmy zbiory znaków, które oznaczały, że w ciągu musi wystąpić dokładnie jeden znak ze zbioru. Co jeśli jednak tych znaków musi wystąpić więcej lub konkretna ich liczba? Wtedy właśnie stosujemy kwantyfikatory. Znaki *, +, ? i nawiasy klamrowe {} to tzw. kwantyfikatory. Służą one do określania ile razy w ciągu wystąpić musi wyrażenie je poprzedzające. Są to bardzo często wykorzystywane funkcjonalności jeśli chodzi o wyrażenia regularne. Dzielą się na dwie grupy - ogólne i szczegółowe. Opiszemy sobie je po koleji.Kwantyfikatory ogólne:
- * (gwiazdka) oznacza zero lub więcej wystąpień
- + (plus) oznacza jedno lub więcej wystąpień
- ? (znak zapytania) oznacza zero lub jedno wystąpienie
Gwiazdka (*)
Oznacza zero lub więcej wystąpień. Popatrzmy na przykłady - najpierw przykład bez użycia gwiazdki:
- $w = preg_match('/ab[A-Z]/', 'abC');
W przypadku tym, aby zaistniało dopasowanie, w badanym tekście po ciągu ab musi wystąpić JEDEN znak z zakresu [A-Z] .
Przyjrzyjmy się teraz temu wyrażeniu:
- /ab[A-Z]*/
Wyrażenie takie pasować będzie do poniższych ciągów:
- ab
- abC
- abD
- abXYZ
- abABCDEF
Zapis z gwiazdką oznacza tutaj, że ciąg złożony z dowolnej liczby wielkich liter może, ale nie musi wystąpić (zero lub więcej wystąpień) po ciągu ab.
Plus (+)
Znak + oznacza jedno lub więcej wystąpień, dopasowywany ciąg musi więc wystąpić co najmniej raz. Wykorzystajmy teraz ten kwantyfikator zamiast gwiazdki:
- /ab[A-Z]+/
Wyrażenie takie pasować będzie do poniższych ciągów:
- abA
- abC
- abD
- abXYZ
- abABCDEF
Zapis z + oznacza tutaj, że ciąg złożony z dowolnej liczby wielkich liter [A-Z] musi wystąpić co najmniej raz po ciągu ab.
Nie będzie zatem pasować nam już do:
- ab
Znak zapytania (?)
Kwantyfikator ten określa zero lub jedno wystąpienie. Wyrażenie jak poniżej:
- /ab[A-Z]?/
pasować będzie jedynie do ciągów:
- ab
- abA
- abC
- abX
Nie będzie za to pasować nam do:
- abAB
- abCDE
- abXYXXZ
gdyż znak złożony z wielkiej litery występuje po ciągu ab więcej, niż jeden raz.
Kwantyfikatory szczegółowe - {}
Tym rodzajem kwantyfikatorów określamy DOKŁADNĄ liczbę wymaganych wystąpień. Liczbę wymaganych wystąpień podajemy w nawiasie klamrowym tóż po wymaganym ciągu. Wykorzystać możemy go na kilka sposobów - podając dokładną liczbę wystąpień, minimalną liczbę wystąpień, maksymalną liczbę wystąpień oraz liczbę wystąpień z podanego zakresu. Poniżej lista wraz z opisem jak to działa:- {n} oznacza dokładnie n wystąpień
- {n,} oznacza co najmniej n wystąpień
- {m, n} oznacza od m do n wystąpień
Przykładowo, wyrażenie o postaci:
- ab[A-Z]{1, 3}
oznacza, że po ciągu ab wystąpić musi od 1 do 3 znaków z zakresu [A-Z] i pasować będzie np. do:
- abA
- abC
- abCD
- abCDE
Wyrażenie natomiast jak poniżej:
- ab[A-Z]{2, }
oznacza, że po ciągu ab wystąpić muszą conajmniej 2 znaki z zakresu [A-Z] i pasować będzie do:
- abAB
- abABC
- abABCD
- abABCDE
Przy używaniu nawiasów klamrowych należy pamiętać, że taki kwantyfikator dotyczy jedynie ostatniego znaku przed nim, a więc wyrażenie:
- kot{2, 5}
nie oznacza tutaj, że ciąg kot musi wystąpić od 2 do 5 razy, lecz, że litera t musi tyle razy wystąpić.
Zapis taki będzie więc pasował jedynie do:
- kott
- kottt
- kotttt
- kottttt
Jeśli chcemy, aby kwantyfikator stosowany był do całego ciągu kot, a nie tylko do ostatniej litery, musimy zastosować nawias grupujący:
- (kot){2, 5}
Dopiero taki zapis oznacza, iż ciąg kot musi wystąpić od 2 do 5 razy i dopasowany zostanie do:
- to jest kotkot
- to jest kotkotkot
- to jest kotkotkotkot
- to jest kotkotkotkotkot
13. Przechwytywanie - nawiasy okrągłe ()
W tym momencie dochodzimy do bardzo ciekawej i bardzo często używanej funkcjonalności wyrażeń regularnych. Przechwytywanie pozwala na wyodrębnianie dopasowanego ciągu do tablicy. Przechwytywania dokonujemy za pomocą nawiasów klamrowych () - tych samych, które służą do grupowania elementów ciągu. Przechwycone w nawiasach dopasowania są następnie umieszczane w tablicy, którą podajemy jako 3 parametr funkcji preg_match():
- $w = preg_match('/(kot|pies)/', 'To jest kot', $matches);
Wszystko to co zostanie objęte nawiasami klamrowymi w wyrażeniu zostanie przechwycone do tablicy $matches. Przechwyceń takich można dokonać więcej, niż jedno - w przypadku większej ich ilości będą one umieszczane jako kolejne elementy tablicy $matches. Warto tutaj wiedzieć, że przechwycone dopasowania lądują w tablicy zawsze począwszy od indeksu = 1, czyli od $matches[1] do $matches[n]. W indeksie zerowym tablicy, czyli $matches[0] znajduje się zawsze ta część ciągu, od którego zaczęło się dopasowanie.
Aby to zobrazować popatrzmy na przykład poniżej.
Mamy sobie taki oto tekst:
- Janusz wisi Andrzejowi 125zł i powiedział, że odda za 2 lata.
Chcemy z tego tekstu przechwycić wartość długu i czas za jaki zostanie on zwrócony.
Zrobimy to następującym wyrażeniem:
- /([0-9]+)[^0-9]+([0-9]+)/
lub bardziej skrótowo:
- /(\d+)\D+(\d+)/
Co to oznacza po koleji?
- \d+ - oznacza pierwszą część ciągu, która jest złożona jedynie z cyfr, musi tutaj wystąpić conajmniej raz (kwantyfikator +)
- (\d+) - oznacza przechwycenie powyższego
- \D+ - oznacza wystąpienie części ciągu, która nie zawiera w sobie cyfr.
- \d+ - oznacza kolejną część ciągu, która jest złożona jedynie z cyfr, musi tutaj wystąpić conajmniej raz (kwantyfikator +)
- (\d+) - oznacza przechwycenie powyższego do kolejnego elementu w tablicy.
Zobaczmy teraz na przykładzie kodu:
- $w = preg_match('/(\d+)\D+(\d+)/', 'Janusz wisi Andrzejowi 125zł i powiedział, że odda za 2 lata.', $matches);
Wykonanie powyższego spowoduje, że w tablicy $matches znajdziemy następujące elementy:
- $matches[0] - '125zł i powiedział, że odda za 2'
- $matches[1] - '125'
- $matches[2] - '2'
Nawiasy można w sobie zagnieżdźać - przechwytywanie zaczyna się wtedy od nawiasa znajdującego się najbardziej "na zewnątrz". Zobaczymy to na przykładzie:
- $w = preg_match('/((\d+)\D+)(\d+)/', 'Janusz wisi Andrzejowi 125zł i powiedział, że odda za 2 lata.', $matches);
Wykonanie powyższego spowoduje, że w tablicy $matches znajdziemy następujące elementy:
- $matches[0] - '125zł i powiedział, że odda za 2'
- $matches[1] - '125zł i powiedział, że odda za '
- $matches[2] - '125'
- $matches[3] - '2'
W powyższym przykładzie najpierw dokonujemy przechwycenia:
- ((\d+)\D+) - '125zł i powiedział, że odda za '
Następnie wewnątrz niego:
- (\d+) - '125'
I na koniec ostatnie przechwycenie:
- (\d+) - '2'
I to tyle w części pierwszej.
W kolejnej części omówimy sobie pozostałe funkcje, takie jak przechwytywania wsteczne, modyfikatory, aliasy, czy podmianę dopasowań z preg_replace() i przeanalizujemy kilka praktycznych zastosowań wyrażeń regularnych.
czy i jak istnieje odwrócenie wyrazenia zanim stanie sie ono wyrazeniemreguralnym ?
OdpowiedzUsuńZnaczy w jakim sensie? Bo nie za bardzo rozumiem pytanie.
UsuńPhp Majster: [Php][Regex] Podstawy Wyrażeń Regularnych Cz.1 >>>>> Download Now
Usuń>>>>> Download Full
Php Majster: [Php][Regex] Podstawy Wyrażeń Regularnych Cz.1 >>>>> Download LINK
>>>>> Download Now
Php Majster: [Php][Regex] Podstawy Wyrażeń Regularnych Cz.1 >>>>> Download Full
>>>>> Download LINK 7c
W punkcie 13 nazywasz nawiasy okrągłe nawiasami klamrowymi. Dwa razy. ;)
OdpowiedzUsuńTen komentarz został usunięty przez autora.
OdpowiedzUsuńA co oznacza 'sim' w formie '/.*/sim' ?
OdpowiedzUsuńŚwietnie wszystko wytłumaczone, Gratulacje.
OdpowiedzUsuńMożna też skorzystać z T-Regx'a
OdpowiedzUsuńŚwietnie wytłumaczone podstawy
OdpowiedzUsuń__________________________
https://www.aptusshop.pl/sklepy-internetowe-wroclaw.php
Dzięki temu artykułowi, po 13 latach "w zawodzie" w końcu to zrozumiałem. Zawsze podchodziłem do wyrażeń jak do jeża, a okazuje się że to całkiem proste. Wielki dzięki autorze :-)
OdpowiedzUsuńDoes Titanium have nickel in it? | Titanium Art
OdpowiedzUsuńThere is keith titanium one copper ore that you will see titanium jewelry when looking at this gold alloy - titanium tent stove Titanium Bronze. This titanium bar stock copper is extremely rare and is a very rare fallout 76 black titanium metal
Php Majster: [Php][Regex] Podstawy Wyrażeń Regularnych Cz.1 >>>>> Download Now
OdpowiedzUsuń>>>>> Download Full
Php Majster: [Php][Regex] Podstawy Wyrażeń Regularnych Cz.1 >>>>> Download LINK
>>>>> Download Now
Php Majster: [Php][Regex] Podstawy Wyrażeń Regularnych Cz.1 >>>>> Download Full
>>>>> Download LINK
Dereköy
OdpowiedzUsuńÇamkule
Elmalı
Asartepe
Davutlar
D3O
Denizli
OdpowiedzUsuńAnkara
Antep
Bursa
Eskişehir
16Vİ
Balıkesir
OdpowiedzUsuńBursa
Mersin
Konya
Van
ROO4KH
https://titandijital.com.tr/
OdpowiedzUsuńkilis parça eşya taşıma
bursa parça eşya taşıma
ığdır parça eşya taşıma
bitlis parça eşya taşıma
İFO
ankara parça eşya taşıma
OdpowiedzUsuńtakipçi satın al
antalya rent a car
antalya rent a car
ankara parça eşya taşıma
B0J
kayseri evden eve nakliyat
OdpowiedzUsuńantalya evden eve nakliyat
izmir evden eve nakliyat
nevşehir evden eve nakliyat
kayseri evden eve nakliyat
V3NU
E5AC5
OdpowiedzUsuńDenizli Şehirler Arası Nakliyat
Sonm Coin Hangi Borsada
Ünye Yol Yardım
Erzurum Lojistik
Ankara Parke Ustası
Etimesgut Fayans Ustası
Sakarya Lojistik
Denizli Şehir İçi Nakliyat
Giresun Şehirler Arası Nakliyat
Wprowadź innowacje do swojej kariery programisty! Dołącz do kursu, aby poszerzyć umiejętności, zanurzyć się w nowoczesnych technologiach i stać się architektem cyfrowego przyszłości. https://coderslab.pl/pl/javascript-developer-react
OdpowiedzUsuń7EBAB
OdpowiedzUsuńpoocoin
poocoin
dexscreener
avax
metamask
trezor suite
defilama
defillama
solflare
Dobra robota! Czekam z niecierpliwością na kolejne wpisy! https://aexol.com/pl/
OdpowiedzUsuń86F8A1DBE2
OdpowiedzUsuńtelegram ücretli şov
BFCB8952D4
OdpowiedzUsuńucuz takipçi
83997F59AB
OdpowiedzUsuńucuz takipçi
شركة انشاء وتنظيف مسابح بجازان mfuv5savgv
OdpowiedzUsuń