Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #23111 > unrolled thread

baco di PHP?

Started bySandro kensan <kensan@kensan.it>
First post2024-03-05 01:17 +0100
Last post2024-03-13 19:19 +0100
Articles 5 — 2 participants

Back to article view | Back to it.comp.www.php


Contents

  baco di PHP? Sandro kensan <kensan@kensan.it> - 2024-03-05 01:17 +0100
    Re: baco di PHP? Leonardo Serni <lserni@gmail.com> - 2024-03-09 19:55 +0100
      Re: baco di PHP? Sandro kensan <kensan@kensan.it> - 2024-03-10 23:44 +0100
      Re: baco di PHP? Sandro kensan <kensan@kensan.it> - 2024-03-10 23:44 +0100
        Re: baco di PHP? Leonardo Serni <lserni@gmail.com> - 2024-03-13 19:19 +0100

#23111 — baco di PHP?

FromSandro kensan <kensan@kensan.it>
Date2024-03-05 01:17 +0100
Subjectbaco di PHP?
Message-ID<l4n6keF5lm6U1@mid.individual.net>
Ho un problema con il mio sito e per isolarlo ho ridotto il codice 
all'osso e ho individuato qualche cosa che non mi sarei mai immaginato. 
questo il codice molto semplice:


$strHTML = '<html><head><title>xx</title></head><body>
Contenuto di esempio.<br><br><br></body></html>';

echo strip_br($strHTML); //toglie gli ultimi <br>


$strHTML = '<html><head><title>xx</title></head><body>
Contenuto di esempio.<br><br><br>
</body></html>';

echo strip_br($strHTML); //toglie gli ultimi <br>


A parte la funzione "strip_br" quel che è sbalorditivo è che il 
risultato è diverso per le due $strHTML:

<html><head><title>xx</title></head><body>
Contenuto di esempio.</body></html>

<html><head><title>xx</title></head><body>
Contenuto di esempio.<br><br><br>
</body></html>

Come si può vedere con il file php:

https://www.kensan.it/pp.php

ora il codice che strippa gli ultimi <br> è banale:

function strip_br($strHTML) {
		// Carica la stringa HTML nel DOMDocument
		$dom = new DOMDocument;
		@$dom->loadHTML($strHTML);
		
		// Rimuovi i tag <br> in coda al contenuto del <body>
		$element = $dom->getElementsByTagName("body")->item(0);
		$childs = $element->childNodes;
		
		// Itera dall'ultimo al primo nodo figlio
		for ($i = $childs->length - 1; $i >= 0; $i--) {
		    $el = $childs->item($i);
		    if ($el->nodeName == "br") {
		        $el->parentNode->removeChild($el);
		    } else {
		        break; // Interrompi quando viene trovato un
                                   nodo diverso da <br>
		    }
		}
		
		// Converti il DOMDocument in una stringa
		return $dom->saveHTML();
}

Io ho PHP 7.4 sul mio server: è per caso una implementazione bacata solo 
del mio provider?

-- 
Sandro kensan www.kensan.it & www.qiqi.it geek site
Saluto gli agenti della NSA - Hello NSA - www.nsa.gov

[toc] | [next] | [standalone]


#23113

FromLeonardo Serni <lserni@gmail.com>
Date2024-03-09 19:55 +0100
Message-ID<31cpuih2fieon1rtbcvkfquir98cn5o6bc@L.Serni>
In reply to#23111
On Tue, 5 Mar 2024 01:17:18 +0100, Sandro kensan <kensan@kensan.it> wrote:

>Ho un problema con il mio sito e per isolarlo ho ridotto il codice 
>all'osso e ho individuato qualche cosa che non mi sarei mai immaginato. 

Fa quello che gli dici di fare: si interrompe quando trova un nodo diverso da
"<br>". Ma mentre

	"<br><br><br>"

termina con <br>,

	"<br><br><br>\n"

non termina per "<br>". Termina con un nodo TEXT che contiene "\n".

Leonardo
-- 

"You all presumably know why" :-) :-(

[toc] | [prev] | [next] | [standalone]


#23114

FromSandro kensan <kensan@kensan.it>
Date2024-03-10 23:44 +0100
Message-ID<l56reaFj4joU1@mid.individual.net>
In reply to#23113
On 09/03/24 19:55, Leonardo Serni wrote:
> On Tue, 5 Mar 2024 01:17:18 +0100, Sandro kensan <kensan@kensan.it> wrote:
> 
>> Ho un problema con il mio sito e per isolarlo ho ridotto il codice
>> all'osso e ho individuato qualche cosa che non mi sarei mai immaginato.
> 
> Fa quello che gli dici di fare: si interrompe quando trova un nodo diverso da
> "<br>". Ma mentre
> 
> 	"<br><br><br>"
> 
> termina con <br>,
> 
> 	"<br><br><br>\n"
> 
> non termina per "<br>". Termina con un nodo TEXT che contiene "\n".

Grazie. Ecco che viene fuori tutta la mia ignoranza sul DOM, però ci 
sbatto la testa ma non cedo. Sarebbe stato tutto molto più semplice con 
le espressioni regolari ma il DOM è il metodo corretto per questo 
problema, in quanto le regex hanno spesso bachi e non considerano casi 
speciali che possono avvenire. Comunque per qualcuno che è alla ricerca 
della soluzione (magari tramite il web anche se Google gruppi ha 
deindicizzato i post nuovi sui ng), ecco il codice:

function strip_br($dom) {

		

// Rimuovi i tag <br> in coda al contenuto del <body>

			$element = $dom->getElementsByTagName("body")->item(0);

$childs = $element->childNodes;

			

// Itera dall'ultimo al primo nodo figlio

for ($i = $childs->length - 1; $i >= 0; $i--) {

   $el = $childs->item($i);

   if ($el->nodeName == "br") {

     $el->parentNode->removeChild($el);

   } else {

     if($el->nodeName != "#text") {

       break; // Interrompi quando viene trovato un nodo diverso da text 
e da br

     }else{

       $nodeValue = rtrim($el->nodeValue, "\n "); // Rimuovi spazi vuoti 
e \n alla fine del testo

       if (!empty($nodeValue)) {

         $el->nodeValue = $nodeValue; // Aggiorna il valore del nodo

         break; // Interrompi quando l'ultimo nodo è del testo non vuoto

       } else {

         $el->parentNode->removeChild($el); // Rimuovi il nodo vuoto

       }

     }

   }

}

return $dom;


}

Mi pare funzioni bene. Certo che è complicato e pensavo fosse più semplice.

Grazie di nuovo Leonardo, senza il tuo aiuto non avrei mai trovato il 
baco. Ho provato a chiedere a ChatGPT ma lui i bachi li crea e non li 
risolve.

-- 
Sandro kensan www.kensan.it & www.qiqi.it geek site
Saluto gli agenti della NSA - Hello NSA - www.nsa.gov

[toc] | [prev] | [next] | [standalone]


#23115

FromSandro kensan <kensan@kensan.it>
Date2024-03-10 23:44 +0100
Message-ID<l56rebFj4joU2@mid.individual.net>
In reply to#23113
On 09/03/24 19:55, Leonardo Serni wrote:
> On Tue, 5 Mar 2024 01:17:18 +0100, Sandro kensan <kensan@kensan.it> wrote:
> 
>> Ho un problema con il mio sito e per isolarlo ho ridotto il codice
>> all'osso e ho individuato qualche cosa che non mi sarei mai immaginato.
> 
> Fa quello che gli dici di fare: si interrompe quando trova un nodo diverso da
> "<br>". Ma mentre
> 
> 	"<br><br><br>"
> 
> termina con <br>,
> 
> 	"<br><br><br>\n"
> 
> non termina per "<br>". Termina con un nodo TEXT che contiene "\n".

Grazie. Ecco che viene fuori tutta la mia ignoranza sul DOM, però ci 
sbatto la testa ma non cedo. Sarebbe stato tutto molto più semplice con 
le espressioni regolari ma il DOM è il metodo corretto per questo 
problema, in quanto le regex hanno spesso bachi e non considerano casi 
speciali che possono avvenire. Comunque per qualcuno che è alla ricerca 
della soluzione (magari tramite il web anche se Google gruppi ha 
deindicizzato i post nuovi sui ng), ecco il codice:

function strip_br($dom) {

		

// Rimuovi i tag <br> in coda al contenuto del <body>

			$element = $dom->getElementsByTagName("body")->item(0);

$childs = $element->childNodes;

			

// Itera dall'ultimo al primo nodo figlio

for ($i = $childs->length - 1; $i >= 0; $i--) {

   $el = $childs->item($i);

   if ($el->nodeName == "br") {

     $el->parentNode->removeChild($el);

   } else {

     if($el->nodeName != "#text") {

       break; // Interrompi quando viene trovato un nodo diverso da text 
e da br

     }else{

       $nodeValue = rtrim($el->nodeValue, "\n "); // Rimuovi spazi vuoti 
e \n alla fine del testo

       if (!empty($nodeValue)) {

         $el->nodeValue = $nodeValue; // Aggiorna il valore del nodo

         break; // Interrompi quando l'ultimo nodo è del testo non vuoto

       } else {

         $el->parentNode->removeChild($el); // Rimuovi il nodo vuoto

       }

     }

   }

}

return $dom;


}

Mi pare funzioni bene. Certo che è complicato e pensavo fosse più semplice.

Grazie di nuovo Leonardo, senza il tuo aiuto non avrei mai trovato il 
baco. Ho provato a chiedere a ChatGPT ma lui i bachi li crea e non li 
risolve.

-- 
Sandro kensan www.kensan.it & www.qiqi.it geek site
Saluto gli agenti della NSA - Hello NSA - www.nsa.gov

[toc] | [prev] | [next] | [standalone]


#23116

FromLeonardo Serni <lserni@gmail.com>
Date2024-03-13 19:19 +0100
Message-ID<q9r3vi58o6qrmmu26oqk8fomm3am5njujf@L.Serni>
In reply to#23115
On Sun, 10 Mar 2024 23:44:22 +0100, Sandro kensan <kensan@kensan.it> wrote:

>sbatto la testa ma non cedo. Sarebbe stato tutto molto più semplice con 
>le espressioni regolari ma il DOM è il metodo corretto per questo 
>problema

Sante parole! Non si usano le regex per parsare l'HTML.

	https://stackoverflow.com/a/1732454/1428679

Leonardo
-- 

"You all presumably know why" :-) :-(

[toc] | [prev] | [standalone]


Back to top | Article view | it.comp.www.php


csiph-web