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
134
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

Utente Attivo
28 Nov 2014
194
30
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

Utente Attivo
28 Nov 2014
194
30
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.