![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam problem z wyrażeniem regularnym, poniżej przykład jak chciałem to rozwiązać, niestety nie działa.
Chodzi o to, aby sprawdzić czy w $string istnieje jedynka i trójka i piątka. Oczywiście cyfry są tylko dla ułatwienia, w rzeczywistości są to ciągi znaków i kolejność nigdy nie jest taka sama. Moje wyrażenie miało sprawdzić czy w stringu istnieje 1 lub 3 lub 5 dokładnie trzy razy, co wydaje się być logiczne i powinno działać, niestety z tego co widzę parser zwraca wystąpienie tylko raz przy pierwszym napotkanym true. Bardzo proszę o pomoc. Jak znaleźć czy w stringu istnieje 1 i 3 i 5. Dokładnie tłumacząc to co mam na myśli: $string może składać się z czegokolwiek ale musi zawierać 1 i 3 i 5 gdzie kolejność cyfr w $string jest przypadkowa. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
A może by tak użyć substr_count()
Ta funkcja zwraca liczbę wystąpień podanego ciągu w ciągu - a więc coś chyba o co Ci chodzi. Możesz napisac na jej podstawię taką funkcję, która sprawdzi podane wszystkie możliwe cyfry czy występują w podanym ciągu znaków tyle razy ile mają (IMG:style_emoticons/default/wink.gif) Prosty przykład:
Ten post edytował Sephirus 4.11.2011, 15:09:08 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
(IMG:style_emoticons/default/smile.gif) nie chodzi mi o funkcję, to musi być wyrażenie regularne, będzie ono wykorzystywane zarówno w MySQL jak i PHP
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jedyne co mi zatem przychodzi do głowy to "bezczelne" sprawdzanie ale jest zupełnie nie konfigurowalne :/
W.R. niestety zwracają uwagę na kolejność - wydaje mi się że tylko w ten sposób możesz być pewien że na bank w tym ciągu występuję 1,3,5 w dowolnej kolejności ;/ Jeżeli się mylę chętnie dowiem się jak można to zrobić inaczej ;P |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
"/(1)\d+(3)\d+(5)\d+/"
@edit z tym że string to "123465789" Ten post edytował cojack 4.11.2011, 15:29:12 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
tak jest prościej, ale muszę powiedzieć, że mnie to nie satysfakcjonuje, tym bardziej, że szukanych może być na prawdę dużo ;( Jak ktoś ma jakiś dobry pomysł to proszę o sugestie, ehh "/(1)\d+(3)\d+(5)\d+/" @edit z tym że string to "123465789" Pisałem, że kolejność może być inna, czyli jeśli $string przyjmie wartość 987654321 to już nie wyłapie |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie jest prościej bo jest źle (IMG:style_emoticons/default/smile.gif) String "111" albo "553" przejdzie przez tego preg_matcha ;P
Mi się wydaję, że się nie da (IMG:style_emoticons/default/smile.gif) właśnie przez tą kolejność ;/ Ale życzę powodzenia ;P |
|
|
![]()
Post
#8
|
|
Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Nie jest prościej bo jest źle (IMG:style_emoticons/default/smile.gif) String "111" albo "553" przejdzie przez tego preg_matcha ;P Mi się wydaję, że się nie da (IMG:style_emoticons/default/smile.gif) właśnie przez tą kolejność ;/ Ale życzę powodzenia ;P No nie dodałem, że w $string każda fraza może wystapić tylko i wyłącznie raz. Może być 1,2,3,4 ale nie może być 1,1,2,3 Coś takiego wymodziłem:
ale musisz sprawdzić na swoich stringach, czy działa prawidłowo dziala, ale tak jak napisal sephirus, przejdzie kazda fraza Ogólnie chodziło mi o to żeby zapis był krótki i czytelny, tak jak, np. ((1)|(2)|(3)){3} (szkoda, że nie działa). No nic, w takim wypadku będę musiał osobno pisać pod SQL procedurę powtarzającą FIND_IN_SET(); a w PHP to już bzdurka (IMG:style_emoticons/default/tongue.gif) równie dobrze mogę wykorzystać explode i dać in_array(); Jak ktoś znajdzie jakieś sensowne rozwiązanie, zakładając, że szukanych jest dziesiątki, a nie tylko trzy sztuki to bardzo proszę o napisanie tego w tym poście Ten post edytował cudny 4.11.2011, 15:49:05 |
|
|
![]()
Post
#10
|
|
Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź ![]() |
Cytat dziala, ale tak jak napisal sephirus, przejdzie kazda fraza Kurczę, faktycznie. Hmm, ciekawy problem (IMG:style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ok skoro jeszcze chcesz bez powtórzeń to wymiękam (IMG:style_emoticons/default/tongue.gif) Wydaje mi się, że preg_match też ;P
Swoją drogą dodam tylko, że mój sposób bez preg_matchy może być bez problemu wykonany również przez funkcję z SQL gdybyś chciał to ładnie zrobić to i PHP i SQL to łykną bez wyrażeń (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Może po prostu napisz o jaki konkretny problem chodzi? Bo mam wrażenie że szukasz rozwiązania bardzo na około.
Bo raz piszesz: Cytat Moje wyrażenie miało sprawdzić czy w stringu istnieje 1 lub 3 lub 5 dokładnie trzy razy, a zaraz: Cytat No nie dodałem, że w $string każda fraza może wystapić tylko i wyłącznie raz.
Ten post edytował melkorm 4.11.2011, 16:03:50 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Ale baaaardzo duże ciągi by to były (IMG:style_emoticons/default/smile.gif)
Napisanie wyrażenia nie stanowi dla mnie większej trudności (IMG:style_emoticons/default/tongue.gif) Problemem jest zrobienie tego zgrabnie i przede wszystkim wydajnie. Zrobię sobie procedurkę w SQL, a dla PHP napiszę jakąś funkcję (IMG:style_emoticons/default/smile.gif) Oczywiście nadal czekam na pomysły (IMG:style_emoticons/default/smile.gif) Jak sprawdzić czy zbiór: 1,2,3,4,5 zawiera 1 i 3 i 5 (IMG:style_emoticons/default/smile.gif) melkorm cyt. "Może po prostu napisz o jaki konkretny problem chodzi? Bo mam wrażenie że szukasz rozwiązania bardzo na około." A ja się spytam: Co ma piernik do wiatraka ? Przeczytaj o co chodzi w poście, a potem odpowiedz sensownie, bo jak nie znasz odpowiedzi to spamuj gdzie indziej Ten post edytował cudny 4.11.2011, 16:12:20 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Do spamerów raczej nie należę, ale najwidoczniej sam nie potrafisz sobie sam odpowiedzieć na to co chcesz, przychodzisz pytasz o pomoc, jakbyś nakreślił dokładnie problem i warunki o wiele łatwiej byłoby nam zdiagnozować problem i/lub znaleźć bardziej optymalne / czytelniejsze / łatwiejsze rozwiązanie.
PS. Jeżeli sądzisz że pomaganie na forum to tylko ślepe udzielanie odpowiedzi na zadane pytania bez podsuwania ewentualnych, prostszych i łatwiejszych rozwiązań to się grubo mylisz. PS2. Jeżeli masz zamiar znowu pisać o jakiejkolwiek formie mojego spamowania to sobie daruj, bo raczej nie znasz pojęcia `spamowanie`. PS3. Wątek przeczytałem cały. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Może po prostu napisz o jaki konkretny problem chodzi? Bo mam wrażenie że szukasz rozwiązania bardzo na około. Bo raz piszesz: a zaraz: Do spamerów raczej nie należę, ale najwidoczniej sam nie potrafisz sobie sam odpowiedzieć na to co chcesz, przychodzisz pytasz o pomoc, jakbyś nakreślił dokładnie problem i warunki o wiele łatwiej byłoby nam zdiagnozować problem i/lub znaleźć bardziej optymalne / czytelniejsze / łatwiejsze rozwiązanie. PS. Jeżeli sądzisz że pomaganie na forum to tylko ślepe udzielanie odpowiedzi na zadane pytania bez podsuwania ewentualnych, prostszych i łatwiejszych rozwiązań to się grubo mylisz. PS2. Jeżeli masz zamiar znowu pisać o jakiejkolwiek formie mojego spamowania to sobie daruj, bo raczej nie znasz pojęcia `spamowanie`. PS3. Wątek przeczytałem cały. Inni zrozumieli (IMG:style_emoticons/default/tongue.gif) Nie bierz tego do siebie hehe chodzi o to, że jedno z drugim się nie wykluczało. Zobacz: Cytat Moje wyrażenie miało sprawdzić czy w stringu istnieje 1 lub 3 lub 5 dokładnie trzy razy, I podałem przykład: $string = '1,2,3,4,5,6'; 1 lub 3 lub 5 mają wystąpić dokładnie trzy razy - i tutaj to nie porozumienie - trzy razy czyli raz jedynka, raz trójka i raz piątka - daje 3 ? (IMG:style_emoticons/default/smile.gif) Cytat No nie dodałem, że w $string każda fraza może wystapić tylko i wyłącznie raz. A tutaj wyraźnie napisałem, że w $string czyli 1,2,3,4,5,6 posiada tylko i wyłącznie po jednej sztuce 1 i 2 i 3 i 4 i 5 i 6 Dla tego logiczne wydało mi się, że preg_match('/((1)|(3)|(5)){3}/', '1,2,3,4,5,6'); zwróci true tylko i wyłącznie przy wystąpieniu którejkolwiek z fraz po jednym razie, a tu kupa (IMG:style_emoticons/default/tongue.gif) po pierwszym wystąpieniu zwraca true i przerywa - czyli ((1)|(3)|(5)) nigdy nie wystąpi trzy razy. Doszedłem do wniosku, że chyba nie da się wyrażeniami tego rozwiązać (oczywiście nie dłuuuugaśnymi, już lepiej zrobić ładną funkcję, która będzie pewnie bardziej wydajna). Oczywiście jeżeli ktoś wykaże, że się mylę będę niezmiernie wdzięczny (IMG:style_emoticons/default/smile.gif) melkorm - sorki, oceniłem twojego posta jako atak (IMG:style_emoticons/default/tongue.gif) Rozwiązanie: Dla tego co jest podane wyżej rozwiązanie raczej istnieje tylko i wyłącznie poprzez robienie dluuugich wyrażeń używających olbrzymiej ilości logicznego OR, co jak pisałem mija się z celem i jest nie wydajne. Mam jednak możliwość posortowania tego (nie napisałem tego wcześniej bo nie wiedziałem), więc da się to zrobić najprościej na świecie:
Chodzi o to że jeżeli wiem, że cyfry w $string są rosnące i cyfry, których szukam też to zawsze po 3 będzie 7 a po niej będzie 10 i tak dalej Proszę nie zamykać tematu, może jednak ktoś ma jakieś fajne rozwiązanie nie używając sortowania, było by to ciekawe (IMG:style_emoticons/default/smile.gif) Ten post edytował cudny 4.11.2011, 16:54:08 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Cytat Inni zrozumieli Ja też, ale po Twoich wyjaśnieniach wyszło że i tak źle zrozumiałem bo wybrałem zły tok myślenia (IMG:style_emoticons/default/smile.gif) Cytat Doszedłem do wniosku, że chyba nie da się wyrażeniami tego rozwiązać (oczywiście nie dłuuuugaśnymi, już lepiej zrobić ładną funkcję, która będzie pewnie bardziej wydajna). I dobrze myślisz, jeżeli się da to lepiej unikać wyrażeń regularnych (upraszczając oczywiście). Cytat melkorm - sorki, oceniłem twojego posta jako atak Spoko, zapomniałem wstawić kilku fikuśnych emotek i jakoś powiało grozą z tego posta (IMG:style_emoticons/default/biggrin.gif) PS. Jak zrobisz, to wstaw swoje rozwiązania, z chęcią zobaczę jak to w końcu wyszło. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(cudny) Doszedłem do wniosku, że chyba nie da się wyrażeniami tego rozwiązać (oczywiście nie dłuuuugaśnymi, już lepiej zrobić ładną funkcję, która będzie pewnie bardziej wydajna). No cóż... mylić się jest rzeczą ludzką Cytat(melkorm) I dobrze myślisz, jeżeli się da to lepiej unikać wyrażeń regularnych (upraszczając oczywiście). To znaczy, że musisz jeść więcej warzyw. Możliwe, że czegoś nie zrozumiałem, ale to wyrażenie powinno sprawdzić czy w $string występują dane liczby tylko raz w danej kolejności. Chyba o to chodziło? |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Cytat Oczywiście cyfry są tylko dla ułatwienia, w rzeczywistości są to ciągi znaków i kolejność nigdy nie jest taka sama. Raczej na Twoje rozwiązanie ktoś by wcześniej wpadł gdyby kolejność była ustalona. |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Raczej na Twoje rozwiązanie ktoś by wcześniej wpadł gdyby kolejność była ustalona. Rozumiem, ale to również nie problem (IMG:style_emoticons/default/smile.gif) Proszę: Ten post edytował pyro 4.11.2011, 17:34:34 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Dla takich wartości też zwróci true. Chociaż pomysł nie głupi (IMG:style_emoticons/default/smile.gif) Ok (IMG:style_emoticons/default/smile.gif) udało mi się hehe. Oczywiście wiem, że tylko ja wiem do czego to ma służyć i jak powinno wyglądać dokładnie, więc było mi duuuużo łatwiej niż Wam, ale i tak ciesze się, że mi się udało (IMG:style_emoticons/default/tongue.gif) to czego szukam to nie są liczby jak już pisałem. są to ID które ukrywają w sobie także inne dane wykorzystywane później, ale mniejsza z tym. Ciąg, w którym szukam wygląda mniej więcej tak:
W $string nie ma możliwości aby się powtarzały poszczególne ID, to znaczy nie może to być:
bo 1_1_1 powtarza się. Jest to zabezpieczone dużo wcześniej i nie będzie takiej sytuacji. W $string muszą być takie oto ID: 1_1_2 i 1_1_1 i 1_4_1 Powyższe ID muszą być wszystkie dokładnie po jednym razie każdy. Rozwiązanie:
Po prostu odwróciłem troszki to czego szukam. Chodzi o to, że $search może składać się tylko i wyłącznie z tego co jest w $string i to musi się powtórzyć tyle razy ile jest szukanych w $search + ilość przecinków czyli 1_1_2 + 1_2_2 + 1_1_4 + dwa przecinki = {5} Jak się podoba (IMG:style_emoticons/default/smile.gif) ? Ten post edytował cudny 4.11.2011, 21:24:47 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 29.09.2025 - 02:47 |