• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed PHP wyrażenia regularne . Problem z preg_match

VPS Starter Arubacloud
0 głosów
276 wizyt
pytanie zadane 24 kwietnia 2018 w PHP przez Browarnik123 Użytkownik (830 p.)
zamknięte 24 kwietnia 2018 przez Browarnik123
$dane = file_get_contents("serverlog.txt");
$dane = iconv("ISO-8859-1","UTF-8",$dane);
$dane = str_replace( "¿", 'ż', $dane );
$dane = str_replace( "³", 'ł', $dane );
$dane = str_replace( "ñ", 'ń', $dane );
$dane = str_replace( "¹", 'ą', $dane );
$dane = str_replace( "ê", 'ę', $dane );
$dane=strchr($dane, "Nazwa logu:"); 
$dane = explode(" ", $dane);
$tekst[0] = "a" ;
$daty[0] = "a" ;
for($i=0 ; $i<count($dane) ; $i++)
{
    if($dane[$i]!="")
    {
    $tekst[$i] = $dane[$i] ;    
    }
}
for($a=0 ; $a<count($tekst) ; $a++)
{
    if(preg_match('@^[2000-4000]-[0-1][0-9]-[0-3][0-9]$@',$tekst[$a]))
    {
    $daty[$a] = $teskt[$a] ;    
    }
}
print_r($daty) ;

Mam oto taki kod który ma za zadanie pobrać do tablicy $daty wszystkie daty z tablicy $tekst . Lecz wynikiem tej operacji jest : Notice: Undefined offset: 7 in C:\xamppp\htdocs\index.php on line 27 napisane wiele razy . Wie ktoś w czym jest błąd ? 

komentarz zamknięcia: rozwiazany

1 odpowiedź

+1 głos
odpowiedź 24 kwietnia 2018 przez Browarnik123 Użytkownik (830 p.)

Dobra pomyliłem się , powinno być tak : 

if(preg_match('@^[0-9]{1,4}\-[0-9]{2}\-[0-9]{2}$@',$tekst[$a]))

 

nie wolno dawać do 0 do 2000 najwyżej 4 razy po od 0 do 9 .

Najwyżej ktoś kiedys skorzysta

komentarz 24 kwietnia 2018 przez Tomek Sochacki Ekspert (227,490 p.)

Ale czy na pewno regexp dopasowuje to czego oczekujesz?

^[0-9]{1,4}\-[0-9]{2}\-[0-9]{2}$

Ten wzorze dopasowuje kolejno:

^[0-9]{1,4}\-[0-9]{2}\-[0-9]{2}$

^          //początek ciągu znakowego
[0-9]{1,4} //od jednej do czterech cyfr
\-         //znak myślnika
[0-9]{2}   //dokładnie dwie cyfry
\-         //znak myślnika
[0-9]{2}   //dokładnie dwie cyfry
$          //koniec ciągu znakowego

Czyli jeśli mówimy tu o dacie to rok pozwoli dopasować jako liczbę jedocyfrową - może chodziło Ci o kwantyfikator {4} czyli dokładnie cztery cyfry.

Tak na marginesie, poprzednio miałeś zapis:

[2000-4000]

ale czy wiesz, co on dopasowuje :) ?

Otóż w tym momencie regexp działa tak:

[2000-4000]


[    //początek klasy znaków
200  //dopasuj cyfrę 2, 0 lub 0
0-4  //dopasuj 0, 1, 2, 3 lub 4
000  //dopasuj 0, 0 lub 0
]    //koniec klasy znaków

Symbol myślnika odnosi się bowiem zawsze do dwóch sąsiednich znaków, czyli do zera i czwórki. Dopasowanie większych liczb trzeba robić poprzez odpowiednie dopasowywanie pojedynczych cyfr, więc to nie jest dopasowanie od 2000 do 4000.

Ten wzorzec tak na prawdę dopasowuje cyfry 0, 1, 2, 3 lub 4 :)

Podobne pytania

0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 3 czerwca 2020 w PHP przez Klaudiaaa Początkujący (390 p.)
0 głosów
1 odpowiedź 920 wizyt
+2 głosów
1 odpowiedź 154 wizyt
pytanie zadane 5 października 2020 w Inne języki przez apofix Początkujący (270 p.)

93,028 zapytań

141,991 odpowiedzi

321,294 komentarzy

62,375 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...