- Home
- Categorie
- Coding e Sistemistica
- Coding
- Difficoltà con preg_replace_callback
-
Difficoltà con preg_replace_callback
Buongiorno a tutti. Cerco di spiegare il più accuratamente possibile quello che mi occorrerebbe.
In php vorrei sostituire delle variabili ricevute dal database con informazioni fisse.
La prima parte delle variabili è nota (foglio_1360x768.php?ID=3 oppure foglio_1366x768.php?ID=3) mentre nella seconda parte della stringa possono venire aggiunte altre informazioni.
Ad esempio: foglio_1360x768.php?ID=3&IDMsgPadre=1207&p=1 oppure foglio_1366x768.php?ID=3&IDMsgPadre=1181&p=1 ecc.Provando a utilizzare il seguente codice mi prende in considerazione solo il primo risultato e mi fornisce sempre 1366.
$grande = "1366";
$piccolo = "1360";
$content = preg_replace_callback("#{foglio_1360x768.php?ID=3(.+?)}#si", function ($matches) { return $piccolo ->value[$matches[1]]; }, $rs["Zona"]);
$content = preg_replace_callback("#{foglio_1366x768.php?ID=3(.+?)}#si", function ($matches) { return $grande ->value[$matches[1]]; }, $rs["Zona"]);Sapendo che $rs["Zona"] è dove vengono recuperate le informazioni, vorrei ricevere la risposta giusta in base alla pagina visitata, quindi se si visitasse la pagina foglio_1360x768.php?ID=3 deve fornire 1360, stessa cosa visitando foglio_1360x768.php?ID=3&IDMsgPadre=1207&p=1
mentre visitando foglio_1366x768.php?ID=3&IDMsgPadre=1181&p=1 o foglio_1366x768.php?ID=3 o foglio_1366x768.php?ID=3&IDMsgPadre=9999&p=1 deve fornire 1366Non sono molto ferrato in codici ma se vorreste aiutarmi ve ne sarei davvero grato.
Vi ringrazio in anticipo
-
Perché usare le espressioni regolari se la stringa da processare è tanto breve?
Ti consiglio invece l'uso di explode().
[PHP]
$input = "foglio_1360x768.php?ID=3&IDMsgPadre=1207&p=1";// Raccogliamo prima il valore (1360 o 1366). Entrambi i valori sono preceduti e seguiti da una parte di stringa fissa.
// Quindi iniziamo ad esplodere:
$explode1 = explode("_", $input); // Output: $explode1[0] = foglio || $explode1[1] = 1360x768.php?ID=3&IDMsgPadre=1207&p=1
$width = explode("x", $explode1[1]); // Output = $width[0] = 1360// Ora hai il tuo numero, 1360 e 1366. Se poi vuoi anche gli altri valori andiamo avanti.
$explode2 = explode("?", $explode1[1]); // Output: $explode2[1] = ID=3&IDMsgPadre=1207&p=1// Ultimo explode per determinare nome variabili e valore passati nel foreach.
$explode3 = explode("&", $explode2[1]); // Output: array("ID=3", "IDMsgPadre=1207", "p=1")foreach($explode3 as $value) {
$explode4 = explode("=", $explode3*);
$$explode4[0] = $explode4[1]; //Utilizzo le variabili variabili.
}// Output finale, cosa hai:
echo $width[0]; // Output: 1360
echo $ID; // Output: 3
echo $IDMsgPadre; // Output: 1207
echo $p; // Output: 1
[/PHP]Che puoi usare dove ti pare. Prima di usare le variabili controlla se esistono, nel caso in cui non vengano create perché non presenti nella stringa iniziale. O dai un valore di default all'inizio dello script (prima di tutto ciò).
-
Grazie Gigi per la risposta.
Il problema è che andrebbe bene se $input fosse sempre uguale a “foglio_1360x768.php?ID=3&IDMsgPadre=1207&p=1” ma dovrebbe fornire la stessa risposta anche nei seguenti casi:
foglio_1360x768.php?ID=3&IDMsgPadre=912&p=1
foglio_1360x768.php?ID=3&IDMsgPadre=333&p=1
foglio_1360x768.php?ID=3&IDMsgPadre=2589&p=1
foglio_1360x768.php?ID=3&IDMsgPadre=79080&p=1
ecc.Quindi, la parte fissa sarà sempre uguale a “foglio_1360x768.php?ID=3” mentre la parte variabile è quella che segue “&IDMsgPadre=912&p=1” (ma potrebbe essere anche &IDMsgPadre=50000000&p=1).
Come faccio a digli di darmi la stessa risposta qualunque cosa viene dopo la parte fissa?
-
Il codice inviato sopra dovrebbe fare quello che stai chiedendo. Ti crea le variabili $IDMsgPadre e $p che contengono il valore relativo. Non l'ho provato onestamente, ma se lo provi dovrebbe funzionare..
-
Mi fornisce una serie di errori tra cui "Undefined variable i" oppure ""Undefined index" e anche "Undefined offset".
Mi avevi infatti scritto di controllare se esistono le variabili e a quanto pare non esistono.
Come le posso creare?
-
Errore mio, avevo improntato in precedenza il tutto su ciclo for. Risolvi inserendo prima del foreach $i = 0; e all'interno dello stesso, all'ultima riga, ++$i;
Qui il tutto:
<?php
$input = "foglio_1360x768.php?ID=3&IDMsgPadre=1207&p=1";
// Raccogliamo prima il valore (1360 o 1366). Entrambi i valori sono preceduti e seguiti da una parte di stringa fissa.
// Quindi iniziamo ad esplodere:
$explode1 = explode("_", $input); // Output: $explode1[0] = foglio || $explode1[1] = 1360x768.php?ID=3&IDMsgPadre=1207&p=1
$width = explode("x", $explode1[1]); // Output = $width[0] = 1360// Ora hai il tuo numero, 1360 e 1366. Se poi vuoi anche gli altri valori andiamo avanti.
$explode2 = explode("?", $explode1[1]); // Output: $explode2[1] = ID=3&IDMsgPadre=1207&p=1// Ultimo explode per determinare nome variabili e valore passati nel foreach.
$explode3 = explode("&", $explode2[1]); // Output: array("ID=3", "IDMsgPadre=1207", "p=1")$i = 0;
foreach($explode3 as $value) {
** $explode4 = explode("=", $explode3*);**
** $$explode4[0] = $explode4[1]; //Utilizzo le variabili variabili.**
** ++$i;**
}// Output finale, cosa hai:
echo $width[0]; // Output: 1360
echo "<br />";
echo $ID; // Output: 3
echo "<br />";
echo $IDMsgPadre; // Output: 1207
echo "<br />";
**echo $p; // Output: 1 **
?>Questa volta testato, dovrebbe andare.
-
Sembra che funzioni Gigi.
Così mi fornisce però tutti 1360 perché ovviamente devo implementare anche il 1366.
Basta aggiungere
$input2 = "bacheca_1366x768.php?ID=2&IDMsgPadre=1207&p=11360" ;
Oppure riscrivo lo stesso codice ma cambiando i valori da 1360 a 1366?
-
Onestamente pensavo che tu avessi già dei dati da processare con quel codice. Io ho impostato la variabile chiamandola "$input", ma tu puoi inserire la variabile che contiene le strighe che vuoi processare.
In base alla stringa input che gli dai, lui poi ti determina quelle nuove variabili in cui conosci tutti i valori, che puoi utilizzare per le tue visualizzazioni.
Non sapendo per bene cosa hai e cosa vuoi fare, non saprei dirti di più...
-
Io devo processare diversi tipi di stringhe, ma per capirlo meglio ammettiamo che siano solamente due, ad esempio:
foglio_1360x768.php?ID=2&IDMsgPadre=1207&p=1
foglio_1366x768.php?ID=3&IDMsgPadre=9654&p=1
Come faccio a dire al "$imput" di processarle entrambe nello stesso codice?
-
Usandolo più volte, puoi metterlo tutto in una funzione. Richiamare il file che contiene questa funzione (oppure metterla all'interno dello stesso file, prima di richiamare la funzione, se non ti serve utilizzarla in altre pagine).
**<?php
function dimensione($input) {
**
**// Raccogliamo prima il valore (1360 o 1366). Entrambi i valori sono preceduti e seguiti da una parte di stringa fissa.
**// Quindi iniziamo ad esplodere:
**$explode1 = explode("_", $input); // Output: $explode1[0] = foglio || $explode1[1] = 1360x768.php?ID=3&IDMsgPadre=1207&p=1
**$width = explode("x", $explode1[1]); // Output = $width[0] = 1360
****$width = $width[0];
**// Ora hai il tuo numero, 1360 e 1366. Se poi vuoi anche gli altri valori andiamo avanti.
**$explode2 = explode("?", $explode1[1]); // Output: $explode2[1] = ID=3&IDMsgPadre=1207&p=1**// Ultimo explode per determinare nome variabili e valore passati nel foreach.
**$explode3 = explode("&", $explode2[1]); // Output: array("ID=3", "IDMsgPadre=1207", "p=1")**$i = 0;
*foreach($explode3 as $value) {
** $explode4 = explode("=", $explode3);
** $$explode4[0] = $explode4[1]; //Utilizzo le variabili variabili.
** ++$i;
**}// Metto tutti i risultati in un array che ritorno.
$res = array("width" => ********************$width, "ID" => $ID, "IDMsgPadre" => $IDMsgPadre, "P" => **** $p);
**return $res;**************} // Fine della funzione
// Qui sotto ora puoi utilizzare la funzione
$risultati1 = dimensione($input1);
$risultati2 = dimensione($input2);
// ecc...// Come utilizzi i dati?
echo $risultati1['width']; // Output: 1360 o 1366
echo $risultati1['ID'];**************************************************
echo $risultati1['IDMsgPadre'];****
echo $risultati1['p'];
//Lo stesso per $risultati2, ecc..
?>************************************************
-
Copiando quest'ultimo codice mi tira fuori il fatal error cannot redeclare dimensione() previously declared in (n° riga) in (stesso numero di riga).
Ho cominciato a giocarci un po' sostituendo qualche parametro ma arrivo sempre al punto che mi fornisce solo 1360, anche se la pagina che l'utente sta visitando è la 1366 oppure me li fornisce contemporaneamente (13601366).
Sto impazzendo.
Allora:- se Mario vede la pagina 1360 deve darmi risposta 1360
- se Luigi vede la pagina 1366 deve darmi risposta 1366
- Ovviamente se entrambi entrano e si collegano contemporaneamente e vedono quelle pagine il codice deve fornirmi la risposta che Mario veda la 1360 e Luigi la 1366.
Perdonami se insisto ma non ci sto capendo più niente
-
Io fin'ora avevo capito che tu i dati li avevi da qualche parte, es. nel database.
Se prendi quell'input dall'indirizzo pagina, è inutile tutto il codice sotto per rilevare i vari dati, che puoi ottenere con il $_GET..La funzione l'ho provata e lavora bene, nessun problema come quello che citi. La funzione la dichiari una volta, non devi ripetere tutto per ogni input.
Inserisci qui il tuo codice così vediamo cosa non va. Secondo me hai ripetuto due volte ciò che basta mettere una sola volta (è il senso delle funzioni).
Naturalmente funziona indipendentemente dal valore, 1360, o 1366, ma anche fosse 19352953, va.
-
Tra l'altro, a questo punto, ti suggerisco di mettere tutto con i $_GET[].
Rinominando la pagina in foglio.php
E gli passi i valori così: foglio.php?width=1360&height=768&ID=3&IDMsgPadre=1207&p=1
In questo modo per ricavarli ti bastano:
$_GET['width'] che ti da 1360 o 1366
$_GET['height'] che ti da 768
$_GET['ID'] che ti da 3
$_GET['IDMsgPadre'] che ti da 1207
$_GET['p'] che ti da 1
-
Ecco il pezzo di codice che interessa:
// $rs["Luogo" è dove viene recuperata l'informazione della pagina che sta visitando l'utente precedentemente impostata sul database
// 1 Acquisti , 2 Altro , 3 Vendite ecc.if ($rs["Luogo"] == '1') {
?>
font-size:14px">A visualizzare gli Acquisti</div>
<?
}
elseif ($rs["Luogo"] == '2') {
?>
font-size:14px">A leggere <? echo
str_replace("/foglio_1360x768.php?ID=1", "Problemi 1360" ,
str_replace("/foglio_1360x768.php?ID=2", "Altro 1360" ,
str_replace("/foglio_1360x768.php?ID=3", "Novità 1360" ,str_replace("/foglio_1366x768.php?ID=1", "Problemi 1366" ,
str_replace("/foglio_1366x768.php?ID=2", "Altro 1366" ,
str_replace("/foglio_1366x768.php?ID=3", "Novità 1366" ,
$rs["Zona"])))))); ?> in Bacheca</div>
<?
}
elseif ($rs["Luogo"] == '3') {
?>
font-size:14px">A visualizzare le Vendite</div>
<?
}
// e così viaMa questo codice, nel momento in cui un utente staziona su foglio_1360x768.php?ID=3&IDMsgPadre=1207&p=1
mi fornisce "A leggere Novità 1360&IDMsgPadre=1207&p=1"
Mi occorrerebbe invece che mi fornisca "A leggere novità 1360"Grazie per la pazienza
-
Il codice per trovare il 1360 (o 1366 o altro) è sopra. Se usi quella funzione ti basta usare
$input = quello che prendi dal database
$risultato = dimensione($input);
echo "A leggere novità " . $risultati1['width']; // Stampa: A leggere novità 1360
-
Va bene Gigi. Adesso mi studio come assemblare le cose. Spero di riuscirci.
Sei stato di grande aiuto. Grazie infinite
-
Di nulla.
Segnalo solo errore mio nell'ultimo post con l'echo (ho usato la variabile di esempio sopra $risultati1 invece di $risultato dichiarato), qui tutto corretto:
[PHP]
// qui la dichiarazione della funzione "function dimensione($input) { ecc... copiando tutto come sopra }// $input = quello che prendi dal database, che devi dichiarare sopra e inserire qui sotto dentro dimensione().
$risultato = dimensione($input);echo "A leggere novità " . $risultato['width']; // Stampa: "A leggere novità 1360"
[/PHP]