Match valore array

Folder

Nuovo Utente
6 Mag 2016
4
0
1
Salve a tutti. Vengo subito al dunque. Ho il seguente codice:
If($array [1] [0] == "valore") ...
$array [1][0]... cosa dovrebbe fare ?
$array é stato generato da un preg_match.
Grazie
 

Rikk73

Utente Attivo
7 Apr 2015
141
6
18
Arezzo
Lo devi decidere te cosa deve fare, praticamente tu controlli che in preciso valore (e solo quello in quel punto preciso) sia uguale a qualcosa, quindi si presuppone che questo controllo lo fai tu per poi fare qualcosa se il controllo risulta vero.

Quindi? Cosa gli vorresti far fare?
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
Ciao e benvenuto.
Senza togliere nulla all'intervento di Rikk73, aggiungo giusto qualche informazione che potrebbe chiarirti le idee riguardo l'uso della funzione preg_match.
Resta comunque chiaro che, dalle poche indicazioni da te fornite, non si capisce quale sia il problema (se c'è).
Sarebbe utile che tu fornissi maggiori dettagli, mostrando magari anche il contesto in cui stai applicando quel codice e cercando di chiarire cosa vuoi ottenere e quale sia l'eventuale problema riscontrato.

Normalmente la funzione preg_match restituisce un array delle occorrenze trovate. Il primo elemento ($array[0]) conterrà il testo trovato secondo l'intero pattern, mentre gli elementi a seguire (come, ad esempio, $array[1]) conterranno eventuali occorrenze trovate attraverso i subpattern, cioè i gruppi di cattura definiti tra parentesi nel pattern.

Partiamo quindi da questo punto. Nel tuo scenario stai usando $array[1], per cui si presume che nel pattern dell'espressione regolare che produce tale array, è presente almeno un gruppo di cattura.

La funzione preg_match restituisce un array bidimensionale (come si deduce nel tuo caso) quando viene specificato il flag PREG_OFFSET_CAPTURE. In questo caso, ogni singolo elemento dell'array è costituito, a sua volta, da un array di due elementi, dove il primo (all'indice [0]) riporta il testo dell'occorrenza trovata, mentre il secondo (all'indice [1]) riporta il valore numerico dell'offset di tale occorrenza, cioè la posizione del testo trovato rispetto alla stringa di origine su cui avviene la ricerca.

La condizione che hai indicato non fa altro che verificare se la prima occorrenza trovata (cioè il primo gruppo di cattura) corrisponde al testo "valore".

Un esempio:
PHP:
<?php
preg_match('/^.*(valore)/', "Cerca il valore", $array, PREG_OFFSET_CAPTURE);
print_r($array);
If($array[1][0] == "valore"){
	print_r('La prima occorrenza trovata è "valore"');
}
?>

L'output sarà:
PHP:
Array
(
    [0] => Array
        (
            [0] => Cerca il valore
            [1] => 0
        )

    [1] => Array
        (
            [0] => valore
            [1] => 9
        )

)
La prima occorrenza trovata è "valore"
 

Folder

Nuovo Utente
6 Mag 2016
4
0
1
Grazie intanto per gli interventi.
Allora il mio codice è il seguente:

while (preg_match("/<([[:alpha:]]*)[[:space:]]*([^>]*)>/i",$str,$reg)) {
print_r($reg);
if ($reg[1][0] == "/"){
$tag = strtolower(substr($reg[1],1));
}else{
$tag = strtolower($reg[1]);
}
}
L'array $reg a vedere dal print_r lanciato è unidimensionale, non ho utilizzato il PREG_OFFSET_CAPTURE.
Quindi mi veniva da pensare che $reg[1][0] si riferisse ai due indici dell'array 1 e 0.
Però non ho ancora capito il funzionamento del codice riportato sopra.
Scusate ma sono un pò de coccio...
La prima occorrenza trovata è questa:
Array
(
[0] => Web site by CMSXP
[1] =>
[2] => img alt="Web site powered by CMSXP" hspace="10" src="images/cmsxp.jpg" border="0"
)
Inoltre l'indice [1] non risulta valorizzato il che mi porta un 'string offset: 0' e
Undefined index...
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
Bene. Andiamo per ordine.

Prima cosa: quando posti del codice sul forum dovresti cortesemente utilizzare i tag di formattazione (vedi regolamento al punto 2 sotto " REGOLE DELLA SEZIONE")

Quello che hai postato è già qualcosa in più, ma ancora mancano degli elementi per capire come ti si può aiutare.

Potresti postare la stringa definita in $str, da cui hai ottenuto l'output da te postato?

Puoi specificare il contesto in cui utilizzi quel codice e cosa ti aspetti che faccia?

Puoi specificare da dove lo hai preso? Se hai fatto un semplice copiaincolla o, chessò, magari è parte di un tutorial che stai studiando o di un esercizio preso da qualche guida?

Un consiglio: quando posti una richiesta d'aiuto sul forum cerca di essere il più dettagliato possibile e fornire quante più indicazioni puoi su ciò che stai chiedendo e sul relativo contesto, anche se ti sembra che siano irrilevanti (vedi regolamento al punto 6 sotto " REGOLE DELLA SEZIONE").

Quindi mi veniva da pensare che $reg[1][0] si riferisse ai due indici dell'array 1 e 0.
Però non ho ancora capito il funzionamento del codice riportato sopra.
Non è propriamente esatto. In qualunque caso i due indici, indicati in quel modo, non possono riferirsi allo stesso array principale, se è ciò che pensavi.
Appurato che non si tratta di un array bidimensionale, possiamo dire che il secondo indice è riferito alla stringa contenuta come elemento dell'array stesso.

In sostanza, con $reg[1][0], viene considerato il secondo elemento dell'array (quello con indice [1]) e, di questo elemento che è una stringa (o perlomeno dovrebbe esserlo), viene considerato il primo carattere (cioè il carattere all'indice [0]).

PHP:
if ($reg[1][0] == "/"){
	$tag = strtolower(substr($reg[1],1));
}else{
	$tag = strtolower($reg[1]);
}

Questa condizione, da quel che sembra, verifica se quel primo carattere sia uno slash "/" e, in tal caso, assegna alla variabile $tag la stringa decurtata di quel primo carattere e convertita in minuscolo; altrimenti, l'intera stringa in minuscolo.

Ora, mi pare di capire che si tratta di un qualche controllo sui tag html ma, non vedendo il contesto e in particolare la stringa che stai esaminando, non mi è chiaro il problema dell'elemento vuoto all'indice 1.
Eventualmente, chiarisci meglio quanto ti ho indicato.
 
Ultima modifica:

Folder

Nuovo Utente
6 Mag 2016
4
0
1
Intanto chiedo scusa per la modalità di stesura del post, devo prendere familiarità con il forum.

Per quanto riguarda il codice, effettivamente sto lavorando con una function che dovrebbe filtrare e quindi ripulire la stringa da eventuali frammenti di codice che riporterebbere a sql_injection.

La stringa $str è recuperata da un campo di database.
funzione filtro...
PHP:
function filter($what, $strip="", $save="", $type="") {
		$what = check_html($what, $strip);
		$what = htmlentities(trim($what), ENT_QUOTES);
	}
che richiama funzione check_html
PHP:
function check_html ($str, $strip="") {
    $tmp="";
    $img="";
    $a="";
	if ($strip == "nohtml"){
        $AllowableHTML=array('');
        $str = removeslashes($str);
        $str = preg_replace("/<[[:space:]]*([^>]*)[[:space:]]*>/i",'<\\1>', $str);
        $str = preg_replace("/<a[^>]*href[[:space:]]*=[[:space:]]*\"?[[:space:]]*([^\" >]*)[[:space:]]*\"?[^>]*>/i",'<a href="\\1">', $str);
        $str = preg_replace("/<[[:space:]]* img[[:space:]]*([^>]*)[[:space:]]*>/i", '', $str);
        $str = preg_replace("/<a[^>]*href[[:space:]]*=[[:space:]]*\"?javascript[[:punct:]]*\"?[^>]*>/i", '', $str);
        $tmp = "";
    }
    while (preg_match("/<([[:alpha:]]*)[[:space:]]*([^>]*)>/i",$str,$reg)) {
        $i = strpos($str,$reg[0]);
        $l = strlen($reg[0]);
        if ($reg[1][0] == "/"){
            $tag = strtolower(substr($reg[1],1));
        }else{
            $tag = strtolower($reg[1]);
        }
		if ($a = $AllowableHTML[$tag]){
            if ($reg[1][0] == "/"){
                $tag = "</$tag>";
            }
            }elseif (($a == 1) || ($reg[2] == "")){
                $tag = "<$tag>";
        }else {
                # Place here the double quote fix function.
                $attrb_list=delQuotes($reg[2]);
                $tag = "<$tag" . $attrb_list . ">";
        } 
		if($a != $AllowableHTML[$tag]) {
            $tag = "";
        }
		$tmp .= substr($str,0,$i) . $tag;
		$str = substr($str,$i+$l);
    }
	$str = $tmp . $str;
	return $str;
	exit;
	/* Squash PHP tags unconditionally */
	$str = preg_match("/<\?/i","",$str);
	return $str;
}

Tutto questo è stato preso dal cms php-nuke che tempo fà avevo preso in mano per modificarlo sulla parte theme.
Progetto abbandonato ai tempi e ora ripreso per essere adattato alla gestione PDO e OOP con php 7.
quindi per poter creare delle funzioni ad hoc devo riuscire a capire bene cosa facessero le funzioni originarie.
Per quanto riguarda gli indici vuoti ho risolto al momento verificando se i campi sono vuoti e quindi valorizzando con '0'.
Credo a questo punto di aver ricevuto risposta al mio quesito iniziale, ringrazio quindi sia Rikk73 che WmbertSea per i loro interventi.
 
Discussioni simili
Autore Titolo Forum Risposte Data
V [PHP] Preg Match e Uninitialized string offset PHP 4
F Redirect match 301 SEO e Posizionamento 1
T [PHP] SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of PHP 1
JackIlPazzo Espressione regolare per effettuare match con URI PHP 1
N Motore di ricerca con MATCH e AGAINST PHP 1
B JS Problema MATCH() Javascript 0
L Column count doesn't match value ..... Classic ASP 2
G Valore del campo id maggiore di 9999 MySQL 0
M Leggere in un report il valore di una casella combinata di una maschera Database 0
otto9due Leggere valore da array multidimensionale a chiavi dinamiche PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
L Ripetere Campi disabilitando input in riferimento ad un valore della select jQuery 0
C ACCESS Aprire maschera se valore non presente in una combo MS Access 7
R valore value di un id da passare in chiamata ajax Ajax 3
napuleone modificare il valore dellascroll bar di webkit HTML e CSS 8
R Aprire maschera con Openform filtrando un campo testuale con un valore recuperato da un'altra maschera MS Access 10
D Visualizzazione pagina basata sul valore di un campo del database PHP 2
D controllare valore in tabella mysql PHP 0
M Estrarre valore con SELECT COUNT PHP 0
A passara valore name da .autocomplate Javascript 2
D riempire campo inserendo un valore in un altro campo PHP 2
S riflettere valore di campo input range in live Javascript 0
R aggiornamento valore db in base all'orario PHP 1
W Mandare a capo valore di SQL Classic ASP 2
W fare la somma di un valore estratto da un ciclo while Classic ASP 0
L Ricerca valore mysql e incremento PHP 73
L pdo (stampare un valore con ritorno a funzione) PHP 0
M Problema assegnazione valore PHP 2
M Recuperare valore PHP 5
G [Javascript] Passare un valore via querystring Javascript 1
B [PHP] Valore variabile non riconosciuto PHP 1
S [ASP] SALVARE VALORE SELECT OPTION SU CAMPO TABELLA ACCESS Classic ASP 9
giusebos [PHP] radiobutton: disattivare specifico valore PHP 11
N [PHP] Estrarre singolo valore da array PHP 4
T MYSQL: valore più frequente ma con difficoltà in più... PHP 1
S aggiornare valore di un elemento xml con php PHP 8
D [PHP] Confronto valore negativo PHP 4
G [ASP] Incrementare un valore on the fly su selezione select Classic ASP 3
M [PHP] valore dentro uno shortcode PHP 0
BottyE Valore da javascript a php Javascript 2
M [PHP] valore tabella in campo form PHP 1
M valore tabella in campo form Presentati al Forum 1
V [PHP] Variabile modificata in un if non mantiene quel valore PHP 5
B [PHP] passare valore ad un form su un'altra pagina PHP 4
M [Javascript] [HTML] come aumentare il valore di una progress bar quando si preme un bottone Javascript 1
M [Visual Basic] Cercare un file pdf all'interno di una cartella attraverso il valore di una txtbox Visual Basic 1
paloppa [PHP] Dubbio valore variabile PHP 16
F [Javascript] select list concatenate - passare valore dalla prima alla seconda Javascript 7
V [Javascript] Passaggio valore da popup a pagina madre Javascript 5
danjde [MySQL] Escludere specifico valore dalla query select MySQL 3

Discussioni simili