Visualizzazione risultati 1 fino 19 di 19

Discussione: preg_match_all

  1. #1
    Guest

    Predefinito preg_match_all

    Salve, ho la necessità di trovare una parola che si trova tra altre due parole, ovvero:

    PAROLA1: parola_da_trovare
    ALTRA_PAROLA_CHE_DELIMITA
    il file è tutto così diciamo.. Ho provato a scrivere così:


    Codice PHP:
    <?php

    $contenuto
    = file_get_contents("nome_file.vcf");

    preg_match_all("(PAROLA1(.*?)ALTRA_PAROLA_CHE_DELIMITA)", $contenuto, $risultato);

    foreach (
    $risultato[1] as $value) {
    echo
    $value."<br>";
    }

    ?>

    Ma non stampa a video nulla..Come posso fare?

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

    Predefinito

    Consigli generali:
    • print_r() o var_dump() sono di grande utilita' per guardare risultati dentro array
    • sempre aprire uno script [di prova] settando la visibilita' degli errori ad "Hurt Me Plenty!" con
      Codice PHP:
      error_reporting(E_ALL);


    Piu' in particolare, presumo ci sia un errore che preg_match_all ti da ma non vedi. Questo perche' una regexp deve cominciare e finire con lo stesso carattere delimitatore, e.g. #(.*)# oppure /parola|altra/.
    Ultima modifica di dreadnaut : 20-06-2011 alle ore 04.16.57

  3. #3
    Guest

    Predefinito

    Ah, una volta usavo questo come script per trovare il contenuto tra due 'parole' o quel che sia:

    Codice PHP:
    <?
    $sorgente
    = file_get_contents("nome_file.vcf");
    if(
    eregi('PRIMA_PAROLA(.+)SECONDA_PAROLA', $sorgente, $titolo)) {
    echo
    $titolo[1];
    }
    ?>
    Solo che eregi è deprecato e non saprei come modificarlo, ma comunque è poco "preciso" dato che nonostante metta quelle due parole, se ce ne sono altre uguali prende in considerazione l' ultima. Con error_reporting non mi da nulla, con print_r mi da:

    Codice PHP:
    Array ( [0] => Array ( ) [1] => Array ( ) )
    Ultima modifica di suppliers : 20-06-2011 alle ore 12.29.05

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

    Predefinito

    Citazione Originalmente inviato da suppliers Visualizza messaggio
    Solo che eregi è deprecato e non saprei come modificarlo, ma comunque è poco "preciso" dato che nonostante metta quelle due parole, se ce ne sono altre uguali prende in considerazione l' ultima.
    Lo stesso accade con preg_: gli operatori delle regexp sono greedy, cioe' cercano di raccogliere piu' caratteri possibili. Puoi rendere * e + non-greedy aggiungendo un ? dopo di essi, ad esempio
    Codice:
    PAROLA(.+?)SECONDA

  5. #5
    Guest

    Predefinito

    Se metto il punto interrogativo dopo non mi appare piu' nulla..

  6. #6
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Attualmente, stai usando eregi o preg_match_all?
    Ti consiglio di seguire, nuovamente, i suggerimenti di dreadnaut.

    Se proprio non ci riesci, posta il codice "aggiornato" ( con le tue nuove modifiche )...

  7. #7
    Guest

    Predefinito

    Ora sto tentando con eregi, questo è il codice:

    <?
    Codice PHP:
    $sorgente = file_get_contents("file.vcf");
    if(
    eregi('X-SKYPE-USERNAME:(.+?)FN:', $sorgente, $titolo)) {
    echo
    $titolo[1];
    }
    ?>

  8. #8
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Potresti postare il contenuto di file.vcf?

    "X-SKYPE-USERNAME: valore" e "FN:" sono separati da un ritorno a capo?

  9. #9
    Guest

    Predefinito

    Sì.. Ho provato anche a mandare a capo FN ma non cambia, forse lo avevo mandato male a capo.. Il contenuto di file.vcf preferirei non postarlo, è un file contenente la mia lista skype quindi ci sono dati sensibili..

  10. #10
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ok, a questo punto, prova così:
    Codice PHP:
    $src = file_get_contents('file.vcf');

    if(
    preg_match('/X-SKYPE-USERNAME:(.+?)FN:/s', $src, $m)) {
    echo
    $m[1];
    }

  11. #11
    Guest

    Predefinito

    Grazie ora funziona, ma così ne ottengo solamente uno o tutti quelli presenti? Perchè se applico un foreach così:

    Codice PHP:
    $src = file_get_contents('file.vcf');

    if(
    preg_match('/X-SKYPE-USERNAME:(.+?)FN:/s', $src, $m)) {
    foreach (
    $m as $value) {
    echo
    $value."<br />";
    }
    }
    Non mi dà tutte le parole ma mi manda in output:
    X-SKYPE-USERNAME:parola_trovata FN:
    parola_trovata

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

    Predefinito

    E se per caso lo username non fosse seguito dal nome, visto che l'ordine non è obbligatorio, cosa fai?

    Ti conviene cercare la fine della riga, ovvero $:
    Codice PHP:
    if(preg_match('/^\s*X-SKYPE-USERNAME:\s*(.+?)\s*$/', $src, $m)) {
    Bonus, accettare eventuale whitespace attorno con \s*, in modo che un semplice spazio in più non rompa tutto. Poi, come scritto sopra, usa print_r per capire quale elemento dell'array ti serve, invece di farci cicli strani sopra.
    Ultima modifica di dreadnaut : 20-06-2011 alle ore 18.44.04

  13. #13
    Guest

    Predefinito

    Dread però come hai scritto tu non mi appare nemmeno piu' il primo..

    Codice PHP:
    <?
    $src
    = file_get_contents('fang_wolf.vcf');

    if(
    preg_match('/^\s*X-SKYPE-USERNAME:\s*(.+?)\s*$/', $src, $m)) {
    echo
    $m[1];
    }

    ?>
    se applico print_r($m) dopo " } " mi da come output: Array ( ) 1 , se invece lo applico al codice di javascripter, mi da come output: Array ( [0] => X-SKYPE-USERNAME:parola_trovata FN: [1] => parola_trovata ) 1

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

    Predefinito

    Scusa, il file è su più righe, quindi va aggiunta una m in fondo, per multi line
    Codice PHP:
    if(preg_match('/^\s*X-SKYPE-USERNAME:\s*(.+?)\s*$/m', $src, $m)) {

  15. #15
    Guest

    Predefinito

    Ok ma poi per stamparli a video tutti come faccio? Nonostante sia tutta così la pagina di cui faccio il file_get_contents, scrivendo ad esempio echo $m[2] non mi appare nulla..
    Ultima modifica di suppliers : 20-06-2011 alle ore 19.58.59

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

    Predefinito

    tutti? c'è un valore

  17. #17
    Guest

    Predefinito

    A me servirebbe trovare tutte le stringhe trovate tra quelle due parole.. O.o Se la pagina è composta:
    X-SKYPE-USERNAME:ciao
    FN:

    X-SKYPE-USERNAME:ciao2
    FN:

    X-SKYPE-USERNAME:ciao3
    FN:

    X-SKYPE-USERNAME:ciao4
    FN:
    A me servirebbe che tutti e 4 i valori (ciao1, ciao2, ciao3, ciao4) venissero 'prelevati' e stampati a video..

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

    Predefinito

    Guess guess... preg_match_all(). A te servirebbe leggere le cose e guardarti in giro

  19. #19
    Guest

    Predefinito

    Risolto così:

    Codice PHP:
    $contenuto = file_get_contents("file.vcf");

    preg_match_all("(PRIMA_PAROLA(.*?)SECONDA_PAROLA)s", $contenuto, $risultato);

    foreach (
    $risultato[1] as $value) {
    echo
    $value."<br>";
    }
    Ultima modifica di karl94 : 21-06-2011 alle ore 00.15.38 Motivo: Formattazione del codice

Regole di scrittura

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