Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> preg_match(), wyrażenia regularne
cudny
post
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.

  1.  
  2. $string = '1,2,3,4,5,6,7';
  3.  
  4. echo preg_match('/(1|3|5){2}/', $string);
  5.  


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
cudny
post
Post #2





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Cytat(melkorm @ 4.11.2011, 16:02:36 ) *
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:



Cytat(melkorm @ 4.11.2011, 16:16:35 ) *
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:

  1. $string = '1,3,5,7,8,10';
  2. // szukamy czy jest 3 i 7 i 10
  3. echo preg_match('/(,|^)3,[,0-9]+,7,[,0-9]+,10(,|$)/', $string); // zwróci true
  4. // szukamy czy jest 2,7,10
  5. echo preg_match('/(,|^)2,[,0-9]+,7,[,0-9]+,10(,|$)/', $string); // zwróci false


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
Go to the top of the page
+Quote Post

Posty w temacie
- cudny   preg_match()   4.11.2011, 14:55:11
- - Sephirus   A może by tak użyć substr_count() Ta funkcja zwra...   4.11.2011, 15:06:01
- - cudny   nie chodzi mi o funkcję, to musi być wyrażenie reg...   4.11.2011, 15:09:05
- - Sephirus   Jedyne co mi zatem przychodzi do głowy to "be...   4.11.2011, 15:20:52
- - cojack   "/(1)\d+(3)\d+(5)\d+/" @...   4.11.2011, 15:27:00
- - cudny   [PHP] pobierz, plaintext echo preg_match('/...   4.11.2011, 15:34:53
- - Sephirus   Nie jest prościej bo jest źle String "111...   4.11.2011, 15:35:35
- - blooregard   Coś takiego wymodziłem: [PHP] pobierz, plaintext ...   4.11.2011, 15:39:52
- - cudny   Cytat(Sephirus @ 4.11.2011, 15:35:35 ...   4.11.2011, 15:44:59
- - blooregard   Cytatdziala, ale tak jak napisal sephirus, przejdz...   4.11.2011, 15:49:36
- - Sephirus   Ok skoro jeszcze chcesz bez powtórzeń to wymiękam ...   4.11.2011, 15:57:59
- - melkorm   Może po prostu napisz o jaki konkretny problem cho...   4.11.2011, 16:02:36
- - cudny   Ale baaaardzo duże ciągi by to były Napisanie wyr...   4.11.2011, 16:09:43
- - melkorm   Do spamerów raczej nie należę, ale najwidoczniej s...   4.11.2011, 16:16:35
- - cudny   Cytat(melkorm @ 4.11.2011, 16:02:36 )...   4.11.2011, 16:28:36
- - melkorm   CytatInni zrozumieli Ja też, ale po Twoich wyjaśni...   4.11.2011, 16:46:50
- - pyro   Cytat(cudny)Doszedłem do wniosku, że chyba nie da ...   4.11.2011, 17:04:34
- - melkorm   CytatOczywiście cyfry są tylko dla ułatwienia, w r...   4.11.2011, 17:12:30
|- - pyro   Cytat(melkorm @ 4.11.2011, 17:12:30 )...   4.11.2011, 17:32:23
- - cudny   Cytat(pyro @ 4.11.2011, 17:32:23 ) Ro...   4.11.2011, 20:46:55


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 09:22