Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913

    Espressione regolare che "ricorda il nome"

    E' possibile creare un'espressione regolare che quando viene eseguita mi salva delle variabili in un' array?

    Per interdeci, quello che in php sarebbe
    Codice PHP:
    preg_match("/(?<nome>.*)/""Nicolò"); 
    No

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Mi spiace ma JavaScript non supporta la cattura di gruppi nominati. Puoi usare dei gruppi numerati ed eventualmente decidere di escludere dalla cattura quelli che non ti servono, inserendo ?: all'inizio del gruppo.
    Se ti serve necessariamente utilizzare gruppi nominati, sul web puoi trovare script che emulano quel metodo.
    Ad ogni modo, l'equivalente del php, è il metodo match() che restituisce un array delle occorrenze trovate.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Boh, grazie...

    Ma match non è l'equivalente di preg_match_all ?
    Ultima modifica di tampertools; 25-06-2014 a 10:29
    No

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Boh, grazie...
    Non mi sembri convinto. Se ti serve qualcosa di particolare puoi spiegare cosa devi ottenere. Una soluzione si trova sicuramente.

    Ma match non è l'equivalente di preg_match_all ?
    Che io sappia, dipende sostanzialmente dalla presenza, o no, dall'opzione "g" (ricerca globale) nel pattern. In PHP non esiste questa opzione. Il compito viene affidato alle due diverse funzioni.

    In JavaScript, il metodo match(), senza l'opzione "g", interrompe la ricerca alla prima occorrenza trovata e restituisce un array con un solo elemento (o null se non trova niente). Possiamo dire che equivalga a preg_match.

    Se però aggiungi l'opzione "g" al pattern, allora la ricerca viene eseguita fino all'ultima occorrenza e restituisce un array di tutte le occorrenze trovate (o null se non trova niente). Possiamo dire che equivalga a preg_match_all.

    codice:
    alert('Ciao Mondo'.match(/o/)); // => o
    alert('Ciao Mondo'.match(/o/g)); // => o,o,o
    Ultima modifica di KillerWorm; 25-06-2014 a 13:29
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Visto che secondo me è meglio reinventare la ruota (solo quando non è troppo grande ), me lo sono scritto da solo il polyfiller

    (Solo che anziché String.match(RegExp) l'ho fatto RegExp.exec(String): è la stessa cosa, no?)

    Che ne pensi?

    codice:
    var namedRegExp = function (expression, flags) {
        var __namedGroups = [],
            __isNamed = [],
            exp;
        
        expression = expression.replace(/\((\?(?:P?<([^>]+)>|'([^']+)'))?/g, function (name) {
            __isNamed.push(/^\(\?(?:P?<([^>]+)>|'([^']+)')$/.test(name));
            __namedGroups.push(name.replace(/^\(\?(?:P?<([^>]+)>|'([^']+)')$/, function (name, inAngularBrackets, inSingleQuotes) {
                return inAngularBrackets || inSingleQuotes;
            }));
            return "(";
        });
    
    
        exp = new RegExp(expression, flags);
        
        exp.exec = function (string) {
            var executed = RegExp.prototype.exec.call(this, string),
                i;
            
            if (executed === null) {
                return null;
            }
            
            for (i = 1; i < executed.length; i++) {
                if (__isNamed[i - 1]) {
                    executed[__namedGroups[i - 1]] = executed[i];
                }
            }
            
            return executed;
        };
    
    
        return exp;
    };
    
    
    console.log(namedRegExp("(?<what>[a-z]+):(?'number'[0-9]+)(.*)").exec("id:64a"));
    console.log(namedRegExp("(?P<hours>[0-1][0-9]|2[0-3]):(?<minutes>[0-5][0-9])").exec("22:21"));
    No

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Visto che secondo me è meglio reinventare la ruota (solo quando non è troppo grande ), me lo sono scritto da solo il polyfiller
    Mi sembra giusto

    (Solo che anziché String.match(RegExp) l'ho fatto RegExp.exec(String): è la stessa cosa, no?)
    Sostanzialmente sì, perlomeno in questo caso.

    Che ne pensi?
    Ne ho visti diversi in giro, non ho fatto particolari test. Il tuo script mi sembra comunque valido da quel che ho provato. Direi interessante
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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.