Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Aiuto regular expression

    Salve,

    qualcuno può darmi una mano a fare una regular expression che, dato questo input:

    codice:
    Mon Oct  6 13:41:45 CEST 2008: vl-commcli(2716): executing command "vmstat | tail -1 | head -1 | awk '{ print $13 " " $14 " " $15 }'"
    mi tiri fuori due match, il primo che è soltanto la data (da mon a cest 2008), e il secondo tutto il resto? Questa è ovviamente la i-esima riga del /var/log/messages.log, quindi è suppergiu generica.

    grazie a chi si interessa
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  2. #2
    fai uno split, o un explode, su ": " e dovresti trovare un array con tre elementi, il primo è la data, tutto il resto ricucilo con un implode ": " ed ottieni quello che ti serve.

  3. #3
    Codice PHP:
    $str"Mon Oct  6 13:41:45 CEST 2008: vl-commcli(2716): executing command \"vmstat | tail -1 | head -1 | awk '{ print $13 \" \" $14 \" \" $15 }'";
    $num0;
    $chunk1'';
    $chunk2'';
    for(
    $i=0;$i<strlen($str);$i++) {
        if(
    $str[$i]==':'){
            
    $num++;
        }
        if(
    $num 3){
            
    $chunk1.= $str[$i];
        }
        else{
             
    $chunk2.= $str[$i];
        }
    }
    var_dump($chunk1);
    echo 
    "
    "
    ;
    var_dump($chunk2); 
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  4. #4
    scusa whisher, ma perché uno dovrebbe complicarsi la vita?

    Codice PHP:
    $str"Mon Oct  6 13:41:45 CEST 2008: vl-commcli(2716): executing command \"vmstat | tail -1 | head -1 | awk '{ print $13 \" \" $14 \" \" $15 }'";

    $exploded explode(": "$str);
    $data $exploded[0];
    $arr = array();
    for(
    $i 1$i count($exploded); $i++)
    {
       
    $arr[] = $exploded[$i];
    }
    $other implode(": "$arr); 

  5. #5
    Originariamente inviato da artorius
    scusa whisher, ma perché uno dovrebbe complicarsi la vita?

    Codice PHP:
    $str"Mon Oct  6 13:41:45 CEST 2008: vl-commcli(2716): executing command \"vmstat | tail -1 | head -1 | awk '{ print $13 \" \" $14 \" \" $15 }'";

    $exploded explode(": "$str);
    $data $exploded[0];
    $arr = array();
    for(
    $i 1$i count($exploded); $i++)
    {
       
    $arr[] = $exploded[$i];
    }
    $other implode(": "$arr); 
    Think it easy stupid
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  6. #6
    parlando a livelli compuazionali, non so dire quale dei due metodi sia piu veloce, se l'explode/implode o una regular expression secca. A termini di gusto personale, la soluzione propostami mi fa rabbrividire :d quindi cercherò di sistemare la regular expression che uso ora per fargli beccare pure questo caso che vi ho postato qui (probabilmente ci sono alcuni caratteri che gli danno fastidio) e poi ve la mostro non per altro, ma su 2000 e passa righe da parsare penso che cmq sia piu veloce la regexp.

    grazie cmq per l'idea
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    34
    Io credo che la data abbia una lunghezza fissa quindi basterebbe una semplice substr()
    Cmq nel caso mi sbagliassi ecco il codice per il parsing dell'intero file
    Codice PHP:
    // Testo di prova
    $text=<<<EOT
    Mon Oct  6 13:41:45 CEST 2008: vl-commcli(2716): executing command "vmstat | tail -1 | head -1 | awk '{ print $13 " " $14 " " $15 }'"
    Mon Oct  7 13:41:46 CEST 2008: vl-commcli(2717): Ciao
    Mon Oct  8 13:41:47 CEST 2008: vl-commcli(2718): ciao ciao
    (questa riga non viene riconosciuta e viene ignorata)
    Mon Oct  9 13:41:49 CEST 2008: vl-commcli(2718): riga ancora
    Mon Oct  9 13:41:49 CEST 2008: vl-commcli(2718): di piu
    EOT;

    $pattern='/(^(?:.+?)\d{4}):\s*(.*)/m';

    preg_match_all($pattern$text$matchesPREG_SET_ORDER);

    var_dump($matches); 

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    34
    ops! la regx che ho postato funziona (se nn fosse che si è perso il '\\' prima della 'd' e della 's', ma giuro li ho postati) ma ha qualche parentesi inutile di troppo.
    Quindi correggo subito:
    Codice PHP:
    $pattern='/^(.+?\\d{4}):\\s*(.*)/m'
    (ho dovuto raddoppiare i '\\', perché? qualcuno lo sa?, è un grosso problema no? l'escape del testo nei post anche tra i tag PHP è un grossissimo problema)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.