Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #23111 > unrolled thread
| Started by | Sandro kensan <kensan@kensan.it> |
|---|---|
| First post | 2024-03-05 01:17 +0100 |
| Last post | 2024-03-13 19:19 +0100 |
| Articles | 5 — 2 participants |
Back to article view | Back to it.comp.www.php
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
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2024-03-05 01:17 +0100 |
| Subject | baco 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]
| From | Leonardo Serni <lserni@gmail.com> |
|---|---|
| Date | 2024-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]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2024-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]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2024-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]
| From | Leonardo Serni <lserni@gmail.com> |
|---|---|
| Date | 2024-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