Visualizzazione risultati 1 fino 22 di 22

Discussione: [PHP][regEx] Parsare un file

  1. #1
    Guest

    Predefinito [PHP][regEx] Parsare un file

    Allora ho questo codice:

    Codice:
    {include:file=nome_file}
    asda
    sd
    asd
    as
    d
    asd
    a
    sdda
    {include:file=altro_file}
    La mia necessità è quella di recuperare il nome_file e altro_file per poi poterlo inserire in una stringa modificata... Solo che sono 2 ore che non funge con nessun tipo di regex che ho scritto...

    Qualcuno ne sa più di me?

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    /^{include:file=(.*)}/ non va ?

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut
    /^{include:file=(.*)}/ non va ?
    preg_replace("/^{include:file=(.*)}/", "\\1", $var);

    no, non mi restituisce il nome

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    O_O cosa stai cercando di fare con quella riga ?

    se hai un file che contiene quelle righe, e vuoi tirare fuori i nome_file, devi leggerlo (in blocco o riga per riga*) e poi usare preg_match o preg_match_all. Replace si usa per sostituire qualcosa in una stringa, non per tirarne fuori una parte

    (*) file() o file_get_contents(), qua una buona lettura
    Ultima modifica di dreadnaut : 04-03-2007 alle ore 13.42.17

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut
    O_O cosa stai cercando di fare con quella riga ?

    se hai un file che contiene quelle righe, e vuoi tirare fuori i nome_file, devi leggerlo (in blocco o riga per riga*) e poi usare preg_match o preg_match_all. Replace si usa per sostituire qualcosa in una stringa, non per tirarne fuori una parte

    (*) file() o file_get_contents(), qua una buona lettura
    Mi sono spiegato male, io devo sostituire a quell'include il contenuto del file indicato, non creare un'array con il nome dei file.

    Codice PHP:
    $corretto = preg_replace("/^{include:file=(.*)}/", "\\1", $var);
    Così dovrebbe essere più chiaro
    Ultima modifica di neoscript : 04-03-2007 alle ore 14.06.43

  6. #6
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Prova così:
    Codice PHP:
    $corretto = preg_replace("/^{include:file=(.*?)}/is", "\\1", $var);
    oppure prova a togliere "is" se nn va.

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Prova così:
    Codice PHP:
    $corretto = preg_replace("/^{include:file=(.*?)}/is", "\\1", $var);
    oppure prova a togliere "is" se nn va.
    Funge, sia con che senza is. Qual'è la funzione di quel is alla fine?

  8. #8
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Serve ad operare una sostituzione.

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Serve ad operare una sostituzione.
    Sbagliato, sono due modificatori di criterio.
    "i" sta per case insensitive, e "s" fa si che anche i caratteri di "a capo" siano inclusi nel carattere speciale "." (che significa tutti i caratteri).


    Ciaoo!!

  10. #10
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Ah ok, grazie per la delucidazione debug, l'ho letto una volta in un tutorial e ad intuito pensavo che servisse a quello ma mi sbagliavo.

    ciao

  11. #11
    Guest

    Predefinito

    I problemi non sono ancora finiti...

    Codice PHP:
    $corretto = preg_replace("/^{include:file=(.*?)}/is", join("", file("\\1")), $var);
    Il problema sta che non sostituisce il codice {include} con il contenuto del file... E non capisco il perchè

  12. #12
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Scusa non ho capito, cosa ti restituisce quella espresisone regolare? COsa vorresti ottenere?

  13. #13
    Guest

    Predefinito

    Le parentesi graffe sono caratteri speciali, backslasheli.


    Ciao!

  14. #14
    Guest

    Predefinito

    Quell'espressione regolare torna il nome del file da includere {include:file=nome_file} e io voglio usare quel nome file per sostituire il codice {include} con il contenuto del file...
    Se stampo solamente il valore (\\1) è corretto, ma quando inserisco la funzione nel preg_replace non va...

  15. #15
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Prova a fare come ha detot debug un post sopra il tuo.

  16. #16
    Guest

    Predefinito

    Codice PHP:
    $corretto .= preg_replace("/^\{include:file=(.*?)\}/is", join("", file("\\1")), $var);
    Intendi così?

    Così non va

  17. #17
    Guest

    Predefinito

    Aspe, quel join prima non c'era o sbaglio?
    Non sono sicuro che quella funzione possa funzionare in quel contesto, perchè forse dovresti aggiungere il comando 'e' che abilita l'interpretazione delle funzioni php all'interno della espressione.
    Io per sicurezza farei così:
    Codice PHP:
    $corretto = preg_replace("#\{include:file=(.*?)\}#is", "\\1", $var);
    implode("", file($corretto));
    Ciaooooo!!!!!

  18. #18
    Guest

    Predefinito

    Citazione Originalmente inviato da debug
    Aspe, quel join prima non c'era o sbaglio?
    Non sono sicuro che quella funzione possa funzionare in quel contesto, perchè forse dovresti aggiungere il comando 'e' che abilita l'interpretazione delle funzioni php all'interno della espressione.
    Io per sicurezza farei così:
    Codice PHP:
    $corretto = preg_replace("#\{include:file=(.*?)\}#is", "\\1", $var);
    implode("", file($corretto));
    Ciaooooo!!!!!
    Codice:
    e
    Se viene specificato questo modificatore, la funzione preg_replace() valuta la stringa di sostituzione come codice PHP, quindi utilizza il risultato come testo da sostituire alle stringhe cercate. Gli apici singoli e doppi sono preceduti dal backslash nei riferimenti sostituiti. 
    
    Soltanto preg_replace() utilizza questo modificatore; le altre funzioni di PCRE lo ignorano.
    E' supportato, ma non capisco dove inserire questo modificatore

    E nel secondo caso, a me serve che il contenuto del file che leggo dalla var \\1 venga sostituito al codice {include etcc..} nella variabile $corretto.

    Grazie comunque per l'aiuto, ste regex non le sopporto
    Ultima modifica di neoscript : 06-03-2007 alle ore 01.36.34

  19. #19
    Guest

    Predefinito

    Prima una semplice quanto spontanea domanda: ma non fai prima a usare un vero include??? :D

    Torniamo alle regex: un esempio di come usare quel modificatore è:
    Codice PHP:
    $testo=pre_replace("#(.*?)#e"," 'ho scritto: '.strtoupper(\\1).', ti piace?' ",$testo);
    Che nel tuo caso si traduce in:
    Codice PHP:
    $corretto=pre_replace("#\{include:file=(.*?)\}#ise"," ''.strtoupper(\\1).'' ",$var);
    (ho lasciato degli spazi tra le virgolette e gli apici per farti notare questi ultimi)


    Ciaooo!!!!!

  20. #20
    Guest

    Predefinito

    Non uso include semplicemente perchè il file che contiene questo codice non è php, ma un file per template...

    Codice PHP:
    $corretto = preg_replace("#^{include:file=(.*?)}#ise"," ''.join('', file(costante.'/'.$this->selected_skin.'/'.\\1.$tpl_extension)).'' ", $var);
    Ho fai finta che il nome del file che leggi con la regex deve vinire in quella stringa formata da una costante, una var di classe e una var normale... Almeno così capisco una volta per tutte come far funzionare sto eval

    Codice:
    Parse error: parse error, unexpected T_DEFAULT in F:\www\template.php(49) : regexp code on line 1
    
    Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Failed evaluating code: ''.join('', file(costante.'/'.default.'/'.da_includere.)).'' in F:\www\template.php on line 49
    ed ecco l'errore

  21. #21
    Guest

    Predefinito

    Purtroppo non posso testare le modifiche che faccio, prova questo:
    Codice PHP:
    $corretto = preg_replace("#\{include:file=(.*?)\}#ise", "join('', file(".costante.".'/'.".$this->selected_skin.".'/\\1'.".$tpl_extension.".'))'", $var);
    E' difficile gestire le concatenazioni di stringhe in questo caso, in cui ci sono costanti php e variabili di classi...


    Ciaoooo!!!!!

  22. #22
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    uhm, mi sono perso un attimo in questa lunga discussione Mi riassumo da solo:
    hai un file template che contiene righe {include:file=<nomefile>} e al loro posto ci finisca il contenuto del file.

    direi che non puoi mettere file('\\1') dentro preg_replace() e sperare che funzioni, perché il secondo parametro della funzione è il pattern di sostituzione - non è una stringa qualsiasi, e \1 (se ci metti gli apici singoli, occhio che cambia il significato...) non viene magicamente sostituito ovunque sia.

    il codice che hai scritto tu, cerca di aprire un file '\\1', che non trova, la funzione file() ritorna false che non è un pattern regexp e tutto va a donnine di scarsa morale dell'est europa.

    Risultato, non puoi fare tutto con una sola riga. Apri il template con file(), esegui un foreach sulle righe, preg_match per vedere se la riga è una direttiva {....} e tirarne fuori i parametri, e poi carichi il file del parametro e sostituisci.

    Btw, quando carichi il file, non farmi join( ...file( )... ), c'é file_get_contents

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •