Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Wyrażenia regularne - problem

Zagadka - mamy taki kod:

<?php
$date = '2008-02-01';
$pattern = '';
preg_match($pattern, $date, $result);
$month = $result[0];
?>

Jak uzupelnić zmienną $pattern, żeby wyciągnąć miesiąć, czyli to "02"? Nie można dopisywać żadnych zmiennych, ani funkcji - tylko modyfikwoać $pattern.

Nie mam pomysłu jak to zrobić.
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Wyrażenia regularne - problem

Nie można zmienić $result[0] na $result[1]?
Stanisław P.

Stanisław P. Software designer

Temat: Wyrażenia regularne - problem

Rafał Grzegorek:
$date = '2008-02-01';
$pattern = '';

'/[12][0-9]{3}-(0[0-9]|1[0-2])-[0-9]{2}/'
chyba, że chcesz bez takiego dokładnego sprawdzania, to:
'/[0-9]{4}-([0-9]{2})-[0-9]{2}/'

No tylko, że miesiąc jest w $result[1], a nie [0].
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Wyrażenia regularne - problem

Stanisław Pitucha:
Rafał Grzegorek:
$date = '2008-02-01';
$pattern = '';

'/[12][0-9]{3}-(0[0-9]|1[0-2])-[0-9]{2}/'
chyba, że chcesz bez takiego dokładnego sprawdzania, to:
'/[0-9]{4}-([0-9]{2})-[0-9]{2}/'

No tylko, że miesiąc jest w $result[1], a nie [0].

No gdyby można było użyć $result[1] to zadanie nie byłoby takie trudne ;-)
Stanisław P.

Stanisław P. Software designer

Temat: Wyrażenia regularne - problem

No właśnie potem się zacząłem zastanawiać, czy problem tkwi w samym wyrażeniu, czy kod jest aż tak niemodyfikowalny...
Można tak:
/\b[0-9]{2}\b/
i będzie działać... problem tylko co będzie jeśli $date ktoś inaczej poda / zmieni format / itd.
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Wyrażenia regularne - problem

Daty na pewno nikt inaczej nie poda. Jutro sobie sprawdzę czy działa.

konto usunięte

Temat: Wyrażenia regularne - problem

prościej :
#.*?-(.*?)-.*?#s

Bardzo niedokładny regex. Jeżeli chcesz go użyć do wyszukiwania daty w dłuższych ciągach, będzie beznadziejny.Mateusz Sokoła edytował(a) ten post dnia 10.04.08 o godzinie 17:53
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Wyrażenia regularne - problem

Mateusz Sokoła:
prościej :
#.*?-(.*?)-.*?#s

Prościej?? A co to wrażenie regularne złapie?
. - oznacza dowolny znak
* - dowolnie wiele (w tym i zero!) wystąpień poprzedniego znaku
? - poprzednie wyrażenie może wystąpić 0 lub 1 raz

Słowa które łapią się do Twojego wyrażenia:
1. xxxxxx-xxxxx-xxxx
2. --
3. -x-
....

x - dowolna cyfra, litera oraz inny znak (np. spacja)
x'ów może być dowolnie wiele lub nie być ich wcale

konto usunięte

Temat: Wyrażenia regularne - problem

Uciąłeś część mojej wypowiedzi. Mianowicie :

Bardzo niedokładny regex. Jeżeli chcesz go użyć do wyszukiwania daty w dłuższych ciągach, będzie beznadziejny.
---
Do parsowania daty, która zawsze jest w tym samym formacie się nadaje.Mateusz Sokoła edytował(a) ten post dnia 10.04.08 o godzinie 23:39
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Wyrażenia regularne - problem

Nieprawda..

aaaa-bb-cc

To nie jest data ;-)

konto usunięte

Temat: Wyrażenia regularne - problem

9999-99-99

to też nie, a ten regex ('/[0-9]{4}-([0-9]{2})-[0-9]{2}/') tego nie uwzględnia :)
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Wyrażenia regularne - problem

Ale dlaczego wziąłeś ten przykład który pasuje do Twojej teorii?:-)
Linijkę wyżej masz takie wyrażenie:
Stanisław Pitucha:

'/[12][0-9]{3}-(0[0-9]|1[0-2])-[0-9]{2}/'

Które uwzględnia PRAWIE poprawne daty (na dniu miesiąca jeszcze trzeba poprawić).
Poza tym Twoje wyrażenie NIE spełnia warunków zadania, bo wynik jest w $result[1] a nie $result[0].

Dla mnie koniec tematu.. ;-)
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Wyrażenia regularne - problem

Widzę, że niezłego szumu narobiłem. :D

To rozwiązanie: "/\b[0-9]{2}\b/" jest prawidłowe. :)

Co właściwie robi "\b"?Rafał Grzegorek edytował(a) ten post dnia 11.04.08 o godzinie 08:58

konto usunięte

Temat: Wyrażenia regularne - problem

Rafał Grzegorek:
Widzę, że niezłego szumu narobiłem. :D

To rozwiązanie: "/\b[0-9]{2}\b/" jest prawidłowe. :)

Co właściwie robi "\b"?
<?php
/* The \b in the pattern indicates a word boundary, so only the distinct
* word "web" is matched, and not a word partial like "webbing" or "cobweb" */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}

if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>Rafał Dudziński edytował(a) ten post dnia 11.04.08 o godzinie 09:10



Wyślij zaproszenie do