Wyrażenia regularne i wyszukiwanie podciągu

Odpowiedz Nowy wątek
2019-05-16 08:30
0

Witam,

Potrzebuje kodu który będzie wyszukiwał w tekście podciąg samych cyfr, najpierw 15, potem 10 jeśli nie znajdzie podciągu o długości 15 cyfr.

Chciałbym żeby ignorował spacje ale nie znaki alfabetyczne, czyli jeśli mam napis "12 qwerty 999 999 999 999 999przyklad"
to żeby skleił wszystkie "9". Obecnie mój kod zachowuje sie tak że dla tego badania wziąłby "129999999999999" czyli pominął by qwerty i nie doszedł nawet do ostatnich dwóch "9". Jak mogę to poprawić?
Mój kod:

                $afterCut = "8664saad--031031502sadad560IMEI866431031502560 Reklamacja naprawy"; //przykład

                $toCut = explode(' ',$number);
                $afterCut = implode('',$toCut);

                if(preg_match('/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/',$afterCut,$IMEImatches) == true)
                {
                        print_r($IMEImatches);
                        echo $cos =strlen($IMEImatches);
                }
                elseif(preg_match('/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/',$afterCut,$NrRepairMatches) == true)
                {
                        print_r( $NrRepairMatches);
                }
edytowany 1x, ostatnio: Draq, 2019-05-16 08:46

Pozostało 580 znaków

2019-05-16 08:39
1

To nie jest może odpowiedź wprost na Twoje pytanie (i pewnie liczyłeś na coś innego), ale skoro nie ogarniasz regexów (to żaden zarzut, po prostu stwierdzenie faktu. Ja zresztą też ich nie lubię i używam jak już naprawdę muszę), to może pomyśl o jakiejś alternatywie. Zawsze można metodą jaskiniowców - rozbić string na poszczególne znaki, a potem za pomocą is_numeric (https://www.php.net/manual/en/function.is-numeric.php) sprawdzać, czy dany znak jest cyfrą. Potem sobie ciąg powstały z wyboru cyfr odpowiednio przetworzysz i po temacie.

Opcja numer 2 - ktoś poda Ci gotowe rozwiązanie, wpiszesz je na sztywno i pewnie będzie działać. Ale, ponieważ nie będziesz rozumieć jak to działa, za chwilę jak pojawi się potrzeba poprawienia czegoś, to problem do Ciebie wróci. A nie sądzę, żebyś teraz robił przyspieszony kurs regexów z powodu potrzeby wyciągnięcia jednego kodu ze stringa.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-05-16 08:40

Pozostało 580 znaków

2019-05-16 08:43
0
cerrato napisał(a):

To nie jest może odpowiedź wprost na Twoje pytanie (i pewnie liczyłeś na coś innego), ale skoro nie ogarniasz regexów (to żaden zarzut, po prostu stwierdzenie faktu. Ja zresztą też ich nie lubię i używam jak już naprawdę muszę), to może pomyśl o jakiejś alternatywie. Zawsze można metodą jaskiniowców - rozbić string na poszczególne znaki, a potem za pomocą is_numeric (https://www.php.net/manual/en/function.is-numeric.php) sprawdzać, czy dany znak jest cyfrą. Potem sobie ciąg powstały z wyboru cyfr odpowiednio przetworzysz i po temacie.

Opcja numer 2 - ktoś poda Ci gotowe rozwiązanie, wpiszesz je na sztywno i pewnie będzie działać. Ale, ponieważ nie będziesz rozumieć jak to działa, za chwilę jak pojawi się potrzeba poprawienia czegoś, to problem do Ciebie wróci. A nie sądzę, żebyś teraz robił przyspieszony kurs regexów z powodu potrzeby wyciągnięcia jednego kodu ze stringa.

No pewnie się nie wyrobie z kursem ale chciałbym to zrozumieć a nie jedynie kopiuj wklej.

Pozostało 580 znaków

2019-05-16 08:45
0

chciałbym to zrozumieć a nie jedynie kopiuj wklej.

No to chwała Ci za to ;) W takim razie niech się wypowie ktoś, kto używa regexów regularnie, więc dla niego stworzenie odpowiedniej formuły to będzie chwila. Ja bym musiał mocno sobie temat odświeżyć i trochę w dokumentacji poszukać :(

Tak czy siak - pokazałem Ci (może trochę prowizoryczną, ale działającą) alternatywę, którą jesteś w stanie ogarnąć od ręki w ciągu dosłownie kilku minut. Możesz to zrobić w ten sposób, czekając na rozwiązanie z wyrażeniami regularnymi.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-05-16 08:45

Pozostało 580 znaków

2019-05-16 09:32
1

Ogarnąłem takim wyrażeniem:

 preg_match('/[0]\d{9}|\d{15}/', $sprawdzanyciag, $trafienia)
edytowany 1x, ostatnio: Draq, 2019-05-16 09:46

Pozostało 580 znaków

2019-05-16 10:24
0
Draq napisał(a):

Ogarnąłem takim wyrażeniem:

 preg_match('/[0]\d{9}|\d{15}/', $sprawdzanyciag, $trafienia)

Czemu dla ciągu dziewięciu cyfr, Twój regex zaczyna je od zera, OP o tym nie pisał. Jeszcze było o spacjach; nie wiem czy takie coś w ogóle można zrobić regexem - musiałby "pamietać" ilość cyfr. Może spróbować tak: wyrażeniem:
[\d ]+
wyłowić wszystkie ciągi liczb ze spacjami, potem odfiltrować piętnasto i ewentualnie dziewięcio cyfrowe.


edytowany 1x, ostatnio: lion137, 2019-05-16 10:31
\x20 to kod szesnastkowy dla spacji, który można wykorzystać w regex - ccwrc 2019-05-16 13:35

Pozostało 580 znaków

2019-05-16 13:08
1

Ja kiedy ćwiczyłem regexpy przygotowałem sobie również małą ściągę, myślę, że pomoże:
https://github.com/ccwrc/ccwr[...]e_pills/blob/master/RegEx.txt

Pozostało 580 znaków

2019-05-16 16:10
1

Sugeruję rozbić to sobie na kilka poleceń. Wyrażenia regularne to potężne narzędzie, które się koszmarnie czyta przy dłuższych tasiemcach.

usuń spacje

/\s*/g -> "" 

złap 15 cyfr

/[0-9]{15}/

jeśli powyższe nic nie złapało, złap 10 cyfr

/[0-9]{10}/

Ale to zadziała tak, że złapie początkowy fragment każdego ciągu liczbowego mającego minimum 15 lub 10 znaków.
Jeśli zależy ci, żeby złapało 15 cyfr obok siebie, ale nie złapało początkowego fragmentu 16+ cyfr, to:

[^0-9]([0-9]{15})[^0-9]
[^0-9]([0-9]{10})[^0-9]

A jeśli zależy ci na faktycznym wydobyciu tych cyfr a nie tylko stwierdzeniu faktu obecności to w wyrażeniu wyjściowym użyj pierwszego atmu $1.


edytowany 2x, ostatnio: Freja Draco, 2019-05-16 16:42

Pozostało 580 znaków

2019-05-16 16:57
0

Spokojnie i łatwo da się to zrobić jednym wyrażeniem:

((?:\d\s*){15})? - ((Cyfra i dowolna ilość spacji) * 15) opcjonalne

[\w\s]*? - Jakieś litery i spacje (non-greedy)

((?:\d\s*){9})? - ((Cyfra i dowolna ilość spacji) * 9) opcjonalne

Wszystko razem:

/^((?:\d\s*){15})?[\w\s]*?((?:\d\s*){9})?$/

Pierwsza grupa złapie (jeśli w ogóle) pierwsze 15 znaków, druga pozostałe (jeśli w ogóle) 9.


char mander; bool basaur;
Zaawansowana biblioteka T-Regx do wyrażeń regularnych w PHP
edytowany 8x, ostatnio: TomRiddle, 2019-05-16 17:00

Pozostało 580 znaków

2019-05-16 17:15
0

Ostatni regex łapie również litery:
https://regex101.com/r/wXBmE3/1


Pozostało 580 znaków

2019-05-16 18:56
0
lion137 napisał(a):

Ostatni regex łapie również litery:
https://regex101.com/r/wXBmE3/1

Niby jak \d. Miałby złapać litery? Najwyżej cały match łapie litery w \w\s, ale tak ma być. W pierwszej grupie jest Twoja 15tka, w drugiej 9tka. Grupa 0 (cały match) możesz olać.


char mander; bool basaur;
Zaawansowana biblioteka T-Regx do wyrażeń regularnych w PHP
Dałęm link - lion137 2019-05-16 18:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0