Visualizzazione risultati 1 fino 5 di 5

Discussione: Estrapolare parole dopo un certo segno

  1. #1
    Guest

    Predefinito Estrapolare parole dopo un certo segno

    Salve, dovrei estrapolare tutte le parole che vengono messe dopo il segno ' @ ' (senza apici) in testo/frase che sia.

    Quindi se ho una frase tipo:

    Ciao @parola , ciao anche a te @parola2

    Voglio ottenere parola e parola2 , come procedo? Avevo pensato a preg_match_all, ma non ho molta confidenza con questa funzione, infatti ho scritto in questo modo per ora:
    Codice PHP:
    <?php

    $frase
    = "Ciao @parola , ciao anche a te @parola2";

    preg_match_all("(@(.*?) )s", $frase, $risultato);

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

    ?>
    Ma ovviamente stampa a video solo 'parola' e non parola2 dato che non ha nulla dopo e quindi nessun delimitatore. Avevo inizialmente omesso il secondo delimitatore in preg_match_all ma non mi stampava a video nulla, quindi come procedo? Pensavo magari di aggiungere uno spazio alla fine della frase (solo nell' elaborazione, non modificherà realmente la frase) per permettere il secondo delimitatore, ma mi sembra un po' ortodosso.

  2. #2
    Guest

    Predefinito

    Prova con

    Codice PHP:
    preg_match_all("/(?<=@)(.+?)\b/s", $frase, $risultato);
    /.../s delimitatori del pattern, s=singola riga, ovvero considera le righe come fossero una sola

    (?<=@) indica che la regola vale se il match è preceduto dal segno @

    (.+?) qualsiasi carattere ripetuto almeno una volta (il ? fa fermare alla prima occorrenza del carattere seguente (\b) anzichè l'ultima)

    \b indica la fine della parola (spazio, punteggiatura, fine riga, ...)

  3. #3
    Guest

    Predefinito

    Grazie mille simple, è proprio ciò che cercavo ^^

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,686

    Predefinito

    Se interessa, senza reg exp:


    Codice PHP:
    $arr = explode(' ', $stringa);
    foreach(
    $arr as $elemento)
    if(
    strpos($elemento,'@') !== false)
    $out1[] = substr($elemento, strpos($elemento,'@')+1);
    ..ho fatto anche un po di prove sul tempo di esecuzione, e mediamente è pure più veloce (il primo è il tempo impegato senza rex exp; il secondo con le regexp):

    1.8119812011719E-5
    2.598762512207E-5

    1.2874603271484E-5
    2.7179718017578E-5

    1.4781951904297E-5
    2.1219253540039E-5

    1.5020370483398E-5
    2.1934509277344E-5

    2.4080276489258E-5
    1.9073486328125E-5

    2.598762512207E-5
    2.4080276489258E-5

    2.8133392333984E-5
    3.504753112793E-5
    Ciao!

  5. #5
    Guest

    Predefinito

    @alemoppo
    concordo sulla pesantezza (e quindi sui tempi di esecuzione) delle espressioni regolari, ma permettimi di trovare il pelo nell'uovo.

    La tua soluzione, che pure condivido, da però un risultato leggermente sporco.
    Sai che la punteggiatura segue la parola precedente, per cui da quel ciclo uscirebbero le parole cercate con attaccati i segni della punteggiatura, il che ti obbliga, per avere un risultato pulito ad ulteriore scrematura.

    Quisquilie, ma mi pare che si debbano considerare

Regole di scrittura

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