Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #20524 > unrolled thread
| Started by | Sandro kensan <kensan@kensan.it> |
|---|---|
| First post | 2016-03-18 16:47 +0100 |
| Last post | 2016-03-21 08:09 +0000 |
| Articles | 20 — 4 participants |
Back to article view | Back to it.comp.www.php
right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-18 16:47 +0100
Re: right trim "br" da un DOM Alessandro Pellizzari <shuriken@amiran.it> - 2016-03-18 16:40 +0000
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-18 20:46 +0100
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-18 22:26 +0100
Re: right trim "br" da un DOM Alessandro Pellizzari <shuriken@amiran.it> - 2016-03-19 08:29 +0000
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-19 15:00 +0100
Re: right trim "br" da un DOM "ciccio" <21669invalid@mynewsgate.net> - 2016-03-19 14:51 +0000
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-19 21:25 +0100
Re: right trim "br" da un DOM Alex <tommaso5ita@yahoo.it> - 2016-03-20 20:01 +0100
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-20 20:38 +0100
Re: right trim "br" da un DOM Alex <tommaso5ita@yahoo.it> - 2016-03-21 13:41 +0100
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-21 14:19 +0100
Re: right trim "br" da un DOM "ciccio" <21669invalid@mynewsgate.net> - 2016-03-21 16:53 +0000
Re: right trim "br" da un DOM Alex <tommaso5ita@yahoo.it> - 2016-03-21 18:29 +0100
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-21 21:30 +0100
Re: right trim "br" da un DOM "ciccio" <21669invalid@mynewsgate.net> - 2016-03-21 22:18 +0000
Re: right trim "br" da un DOM Alex <tommaso5ita@yahoo.it> - 2016-03-21 18:29 +0100
Re: right trim "br" da un DOM Alex <tommaso5ita@yahoo.it> - 2016-03-21 18:28 +0100
Re: right trim "br" da un DOM Sandro kensan <kensan@kensan.it> - 2016-03-21 21:19 +0100
Re: right trim "br" da un DOM "ciccio" <21669invalid@mynewsgate.net> - 2016-03-21 08:09 +0000
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-18 16:47 +0100 |
| Subject | right trim "br" da un DOM |
| Message-ID | <dl2m93Fado5U3@mid.individual.net> |
Salve,
vorrei togliere l'ultimo o gli ultimi <br> da un DOM in modo tale che
non ci siano mai prima di un </body>. Esempio:
<body>
Ciao,<br>
come stai?<br>
Bene, grazie.<br>
<br>
</body>
==>
<body>
Ciao,<br>
come stai?<br>
Bene, grazie.
</body>
In pratica un right trim per i <br> sul DOM.
Forse dovrei fare qualche cosa di questo tipo:
@$dom->loadHTML($strHtml);
//trim last <br> in the DOM
$brs = $dom->getElementsByTagName('br');
$count = $brs->length;
$lastbr = $brs[$count-1]:
e poi vedere se l'elemento successivo a $lastbr è </body> ma non so come
farlo.
Avete un aiuto da darmi?
--
Sandro kensan www.kensan.it & www.qiqi.it geek site
Saluto gli agenti della NSA - Hello NSA - www.nsa.gov
[toc] | [next] | [standalone]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2016-03-18 16:40 +0000 |
| Message-ID | <dl2pc9Fcks4U1@mid.individual.net> |
| In reply to | #20524 |
On 18/03/2016 15:47, Sandro kensan wrote:
> In pratica un right trim per i <br> sul DOM.
>
> Forse dovrei fare qualche cosa di questo tipo:
>
> @$dom->loadHTML($strHtml);
> //trim last <br> in the DOM
> $brs = $dom->getElementsByTagName('br');
> $count = $brs->length;
> $lastbr = $brs[$count-1]:
> e poi vedere se l'elemento successivo a $lastbr è </body> ma non so come
> farlo.
>
> Avete un aiuto da darmi?
O usi XPath per trovare solo i br figli diretti di body, oppure fai un
getElementByTagName('body')[0]->childNodes, e controlli se l'ultimo è un
br, quindi lo cancelli.
Bye.
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-18 20:46 +0100 |
| Message-ID | <dl349hFf2eiU1@mid.individual.net> |
| In reply to | #20525 |
On 18/03/2016 17:40, Alessandro Pellizzari wrote:
> On 18/03/2016 15:47, Sandro kensan wrote:
>
>> In pratica un right trim per i <br> sul DOM.
>>
>> Forse dovrei fare qualche cosa di questo tipo:
>>
>> @$dom->loadHTML($strHtml);
>> //trim last <br> in the DOM
>> $brs = $dom->getElementsByTagName('br');
>> $count = $brs->length;
>> $lastbr = $brs[$count-1]:
>> e poi vedere se l'elemento successivo a $lastbr è </body> ma non so come
>> farlo.
>>
>> Avete un aiuto da darmi?
>
> O usi XPath per trovare solo i br figli diretti di body, oppure fai un
> getElementByTagName('body')[0]->childNodes, e controlli se l'ultimo è un
> br, quindi lo cancelli.
posso fare un:
$bodynode = $dom->getElementByTagName('body')[0];
$childs = $bodynode->childNodes;
$count = $childs->length;
$lastchild = $childs[$count-1]:
foreach ($childs as $child) {
// do something with this node
}
Adesso tento di implementarlo e ti faccio sapere.
--
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 | 2016-03-18 22:26 +0100 |
| Message-ID | <dl3a39Ff2eiU2@mid.individual.net> |
| In reply to | #20525 |
On 18/03/2016 17:40, Alessandro Pellizzari wrote:
> O usi XPath per trovare solo i br figli diretti di body, oppure fai un
> getElementByTagName('body')[0]->childNodes, e controlli se l'ultimo è un
> br, quindi lo cancelli.
è stato complicato ma ci sono esempi validi in Rete per cui sono
riuscito a comporre il mosaico pur conoscendo quasi nulla. Ecco il mio
script che funziona:
//trim lasts <br> in the DOM
$element = $dom->getElementsByTagName("body")->item(0);
$childs = $element->childNodes;
for ($i = $childs->length; --$i >= 0; ) {
$el = $childs->item($i);
if ($el->nodeName == "br") $el->parentNode->removeChild($el);
else break;
}
Sai dirmi quanto è compatibile cancellare i noti scorrendo a ritroso una
lista come la mia? Sarà sempre compatibile?
--
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 | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2016-03-19 08:29 +0000 |
| Message-ID | <dl4gvnFpotkU1@mid.individual.net> |
| In reply to | #20527 |
Il Fri, 18 Mar 2016 22:26:01 +0100, Sandro kensan ha scritto: > Sai dirmi quanto è compatibile cancellare i noti scorrendo a ritroso una > lista come la mia? Sarà sempre compatibile? Non te lo so dire con sicurezza, ma di solito cancellare dalla fine di una lista è una delle operazioni meno pericolose. :) L'unica cosa a cui dovresti stare attento è che potrebbero non essere solo <br> alla fine, ma anche TextNode vuoti, o con solo spazi, tab o a-capo. In pratica una cosa così: <br> Qualcosa. <br> <br> </body> sarà TextNode< > Tag<br> TextNode<\n Qualcosa.\n > Tag<br> TextNode<\n > Tag<br> TextNode<\n> TagEnd<body> Bye.
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-19 15:00 +0100 |
| Message-ID | <dl54ccF717U1@mid.individual.net> |
| In reply to | #20528 |
On 19/03/2016 09:29, Alessandro Pellizzari wrote: > L'unica cosa a cui dovresti stare attento è che potrebbero non essere solo > <br> alla fine, ma anche TextNode vuoti, o con solo spazi, tab o a-capo. Per adesso il problema credo non si ponga in quanto uso un vecchio programma di nome KompoZer per fare i miei semplicissimi testi html, questo programma rielabora l'html e cose come quelle che dici tu non le permette. Certo che uno spazio vuoto è possibile e dovrei modificare il mio codice ma pure un <p></p> è possibile, lo spazio, però, lo vedo più probabile nel mio caso. Se usassi un editor di testo allora i casi come quelli mostrati nel tuo esempio sono possibilissimi. -- 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 | "ciccio" <21669invalid@mynewsgate.net> |
|---|---|
| Date | 2016-03-19 14:51 +0000 |
| Message-ID | <2016031914513921669@mynewsgate.net> |
| In reply to | #20530 |
Sandro kensan <kensan@kensan.it> ha scritto: > On 19/03/2016 09:29, Alessandro Pellizzari wrote: > > > L'unica cosa a cui dovresti stare attento è che potrebbero non essere solo > > <br> alla fine, ma anche TextNode vuoti, o con solo spazi, tab o a-capo. > > Per adesso il problema credo non si ponga in quanto uso un vecchio > programma di nome KompoZer Ti conviene passare a BlueGriffon (http://bluegriffon.org) KompoZer è fermo da molto tempo.
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-19 21:25 +0100 |
| Message-ID | <dl5qtqF2ud0U1@mid.individual.net> |
| In reply to | #20531 |
On 19/03/2016 15:51, ciccio wrote: > Ti conviene passare a BlueGriffon (http://bluegriffon.org) > KompoZer è fermo da molto tempo. Grazie per il link, ho visto che sono andati avanti con lo sviluppo ma dovrei compilarmi i sorgenti in quanto non c'è per la mia distro. -- 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 | Alex <tommaso5ita@yahoo.it> |
|---|---|
| Date | 2016-03-20 20:01 +0100 |
| Message-ID | <ncms2s$2597$1@adenine.netfront.net> |
| In reply to | #20530 |
Il 19/03/2016, Sandro kensan ha detto : > On 19/03/2016 09:29, Alessandro Pellizzari wrote: > >> L'unica cosa a cui dovresti stare attento è che potrebbero non essere solo >> <br> alla fine, ma anche TextNode vuoti, o con solo spazi, tab o a-capo. > > Per adesso il problema credo non si ponga in quanto uso un vecchio > programma di nome KompoZer per fare i miei semplicissimi testi html, > KompoZer era bellissimo, ma si è fermato all' html4 strict. Il suo javascript è aggiornato alla stessa epoca ... BlueGriffon è difficile da adoperare, almeno io l'ho trovato difficile. Magari adesso è cambiato. Bye -- Alex --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-20 20:38 +0100 |
| Message-ID | <dl8chqFpv1cU1@mid.individual.net> |
| In reply to | #20533 |
On 20/03/2016 20:01, Alex wrote: > KompoZer era bellissimo, ma si è fermato all' html4 strict. > Il suo javascript è aggiornato alla stessa epoca ... è sicuramente vecchio ma io lo uso solo per fare dei testi semplicissimi che sono solo il core delle mie pagine web. > > BlueGriffon è difficile da adoperare, almeno io l'ho trovato difficile. > Magari adesso è cambiato. Quando ci sarà la versione per la mia distro lo proverò sicuramente. -- 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 | Alex <tommaso5ita@yahoo.it> |
|---|---|
| Date | 2016-03-21 13:41 +0100 |
| Message-ID | <ncoq5b$q3g$1@adenine.netfront.net> |
| In reply to | #20534 |
Scriveva Sandro kensan domenica, 20/03/2016: > On 20/03/2016 20:01, Alex wrote: > >> KompoZer era bellissimo, ma si è fermato all' html4 strict. >> Il suo javascript è aggiornato alla stessa epoca ... > > è sicuramente vecchio ma io lo uso solo per fare dei testi semplicissimi > che sono solo il core delle mie pagine web. Ah sì, dei frammenti. Poi magari li 'impacchetti' dentro una variabile php. Simpatico il sistema e Kompozer va benissimoo per questo. Bye -- Alex --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-21 14:19 +0100 |
| Message-ID | <dlaaniF9ldaU1@mid.individual.net> |
| In reply to | #20536 |
On 21/03/2016 13:41, Alex wrote: > Ah sì, dei frammenti. Cioè? ha anche un nome quello che faccio? Io non l'ho imparato da nessuno l'ho pensato e l'ho realizzato. > Poi magari li 'impacchetti' dentro una variabile php. Non so se è quello che dici. Praticamente ho voluto avere un file html che contenga il testo senza fronzoli. I miei html contengono solo testo, immagini, link e un po' di stile di testo. Questo per avere un file "fisico" che non metto in mysql per cercare di "separare" il contenuto dal contrenitore e per avere un facile backup. Semplicemente non mi fidavo di mysql. > Simpatico il sistema e Kompozer va benissimoo per questo. Veramente? Le mie pagine html vengono in effetti caricate ed elaborate dal php e alla fine c'è un echo $body che stampa il body della pagina html all'interno di un layout (o come si chiama). -- 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 | "ciccio" <21669invalid@mynewsgate.net> |
|---|---|
| Date | 2016-03-21 16:53 +0000 |
| Message-ID | <2016032116532221669@mynewsgate.net> |
| In reply to | #20537 |
Sandro kensan <kensan@kensan.it> ha scritto: CUT > Questo per avere un file "fisico" che non metto in mysql per cercare di > "separare" il contenuto dal contrenitore e per avere un facile backup. > Semplicemente non mi fidavo di mysql. Come mai non ti "fidavi" di MySQL?
[toc] | [prev] | [next] | [standalone]
| From | Alex <tommaso5ita@yahoo.it> |
|---|---|
| Date | 2016-03-21 18:29 +0100 |
| Message-ID | <ncpb15$29t3$1@adenine.netfront.net> |
| In reply to | #20538 |
Il 21/03/2016, ciccio ha detto : > Sandro kensan <kensan@kensan.it> ha scritto: > > CUT >> Questo per avere un file "fisico" che non metto in mysql per cercare di >> "separare" il contenuto dal contrenitore e per avere un facile backup. >> Semplicemente non mi fidavo di mysql. > > Come mai non ti "fidavi" di MySQL? Già. Che ti ha fatto? Bye -- Alex --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-21 21:30 +0100 |
| Message-ID | <dlb3ufFgkj8U2@mid.individual.net> |
| In reply to | #20540 |
On 21/03/2016 18:29, Alex wrote: > Il 21/03/2016, ciccio ha detto : >> Come mai non ti "fidavi" di MySQL? > > Già. Che ti ha fatto? mah, conoscevo poco di mysql, ho visto negli anni che anche fare porting del data base da hosting provider all'altro è abbastanza semplice. A volte occorre lasciare un server e andare in altri lidi. Però è ovvio che mysql non è un luogo virtuale semplice e gli inconvenienti sono dietro l'angolo. Il mio sito ha molti anni per cui ogni problema è possibile tra cui la dismissione di mysql e/o il trasferimento ad altri tipi di db. Un file html rimane tale negli anni, non ci sono problemi come nel caso dell'incapsulamento in un DB. Adesso pare prendere piede maria DB che per fortuna è pienamente compatibile con mysql. -- 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 | "ciccio" <21669invalid@mynewsgate.net> |
|---|---|
| Date | 2016-03-21 22:18 +0000 |
| Message-ID | <2016032122180921669@mynewsgate.net> |
| In reply to | #20543 |
Sandro kensan <kensan@kensan.it> ha scritto: > On 21/03/2016 18:29, Alex wrote: > > Il 21/03/2016, ciccio ha detto : > > >> Come mai non ti "fidavi" di MySQL? > > > > Già. Che ti ha fatto? > > mah, conoscevo poco di mysql, ho visto negli anni che anche fare porting > del data base da hosting provider all'altro è abbastanza semplice. A > volte occorre lasciare un server e andare in altri lidi. Ovvio che è semplice, basta esportare i dati in un file ed importarli dove vuoi. SQL è uno standard. > Però è ovvio che mysql non è un luogo virtuale semplice e gli > inconvenienti sono dietro l'angolo. Il mio sito ha molti anni per cui > ogni problema è possibile tra cui la dismissione di mysql e/o il > trasferimento ad altri tipi di db. Mah non si capisce che paura hai... Come detto sopra basta esportare i tuoi dati in un file .sql ed importarli poi dove vuoi. Se proprio c'è bisogno di una conversione si fa un programmino convertitore. Tutto qui. > Un file html rimane tale negli anni, non ci sono problemi come nel caso > dell'incapsulamento in un DB. ?! Ma scusa cosa dovresti "incapsulare" in un DB? In un DB ci sono dei campi con tipi precostituiti in cui memorizzare le informazioni. Se proprio hai bisogni particolari ci sono i campi BLOB, ma anch'essi possono benissimo essere esportati. > Adesso pare prendere piede maria DB che per fortuna è pienamente > compatibile con mysql. Certo ne è un fork, non poteva essere diversamente.
[toc] | [prev] | [next] | [standalone]
| From | Alex <tommaso5ita@yahoo.it> |
|---|---|
| Date | 2016-03-21 18:29 +0100 |
| Message-ID | <ncpb1l$29u4$1@adenine.netfront.net> |
| In reply to | #20538 |
Il 21/03/2016, ciccio ha detto : > Sandro kensan <kensan@kensan.it> ha scritto: > > CUT >> Questo per avere un file "fisico" che non metto in mysql per cercare di >> "separare" il contenuto dal contrenitore e per avere un facile backup. >> Semplicemente non mi fidavo di mysql. > > Come mai non ti "fidavi" di MySQL? Già. Che ti ha fatto? Bye -- Alex --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
[toc] | [prev] | [next] | [standalone]
| From | Alex <tommaso5ita@yahoo.it> |
|---|---|
| Date | 2016-03-21 18:28 +0100 |
| Message-ID | <ncpavp$29q2$1@adenine.netfront.net> |
| In reply to | #20537 |
Scriveva Sandro kensan lunedì, 21/03/2016: > On 21/03/2016 13:41, Alex wrote: > >> Ah sì, dei frammenti. > > Cioè? ha anche un nome quello che faccio? Io non l'ho imparato da > nessuno l'ho pensato e l'ho realizzato. > >> Poi magari li 'impacchetti' dentro una variabile php. > > Non so se è quello che dici. Praticamente ho voluto avere un file html > che contenga il testo senza fronzoli. I miei html contengono solo testo, > immagini, link e un po' di stile di testo. > Ci sono dei vantaggi e degli svantaggi. Il vantaggio è quello di avere un codice che 'si capisce'. Senza terribili miscugli di html e php con continue interruzioni ?> html, html html, html <?php e giri logici anche impensabili. la lettura di quello che fa il codice è più agevole. Lo svantaggio, penso, è quello di inviare una unica stringa al browser. Fino a quando non la riceve non fa nulla, mentre se invii la pagina un po' per volta inizia intanto ad eleborarla. Bye -- Alex --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
[toc] | [prev] | [next] | [standalone]
| From | Sandro kensan <kensan@kensan.it> |
|---|---|
| Date | 2016-03-21 21:19 +0100 |
| Message-ID | <dlb3a9Fgkj8U1@mid.individual.net> |
| In reply to | #20539 |
On 21/03/2016 18:28, Alex wrote: > Ci sono dei vantaggi e degli svantaggi. > Il vantaggio è quello di avere un codice che 'si capisce'. Senza > terribili miscugli di html e php con continue interruzioni > > ?> > html, html > html, html > <?php > > e giri logici anche impensabili. > la lettura di quello che fa il codice è più agevole. beh, sì. Si tratta di solo html quindi non c'è alcun php e poi posso usare un editor esterno e non crearmene uno ad hoc come in wordpress. Potevo comunque fare l'upload della pagina html e poi farla inserire in mysql da uno script, oppure potevo fare un copia e incollar in un form e poi inserirla in mysql: le opzioni sono tante. Io ho scelto un vero file html che mio CMS preleva ed estrae il body, lo elabora attraverso il DOM e lo inserisce nell'intelaiatura, tutto fatto in php. > Lo svantaggio, penso, è quello di inviare una unica stringa al browser. > Fino a quando non la riceve non fa nulla, mentre se invii la pagina un > po' per volta inizia intanto ad eleborarla. No, non funziona così. La pagina viene composta tutta lato server in pochi decimi di secondo e viene mandata al browser secondo i tempi di caricamento standard. In pratica è così: |-----------------| | Titolo | |-----------------| | | | | |include(HTML) | | | |-----------------| |footer | ------------------- ovviamente i dati del titolo e del footer sono in mysql e l'include non è un include ma è una lettura di un file e una elaborazione del DOM tra cui l'elaborazione dei link ma comunque l'idea è quella raffigurata. -- 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 | "ciccio" <21669invalid@mynewsgate.net> |
|---|---|
| Date | 2016-03-21 08:09 +0000 |
| Message-ID | <2016032108091621669@mynewsgate.net> |
| In reply to | #20533 |
Alex <tommaso5ita@yahoo.it> ha scritto: CUT > > KompoZer era bellissimo, ma si è fermato all' html4 strict. > Il suo javascript è aggiornato alla stessa epoca ... > > BlueGriffon è difficile da adoperare, almeno io l'ho trovato difficile. > Magari adesso è cambiato. BlueGriffon supporta HTML5, quindi è da preferire sempre e cmq a KompoZer e agli altri che non supportano HTML5. Come facilità d'uso è equiparabile agli altri software WYSIWYG, quindi non richiede chissà quali conoscenze avanzate.
[toc] | [prev] | [standalone]
Back to top | Article view | it.comp.www.php
csiph-web