Newsgroup: it.comp.www.php
Titolo: bug DOM?

ciao
Reproduce code:
---------------
Html:
esempio di textarea che contiene riferimento a una immagine
da mettere in un altro blog ad esempio
[...]
<textarea><img src="foobar" /></textarea>
[...]
Php:
$documentx = new DOMDocument();
$documentx->loadHTML($data);
$textareas = $documentx->getElementsByTagName("textarea");
foreach($textareas AS $textarea){
   print($textarea->getAttribute("value"));
   print($textarea->textContent);
}
So che non esiste attributo value, ma se il contenuto di una textarea č
all'interno di < e > non c'č modo di recuperarlo.
idee?
-- 
e ziocan

 
alla mala parata regexp, ma non credo di dirti nulla di nuovo

 alla mala parata [..]
Sei siciliano? (io pure :) -- Sicilia occidentale)
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 č all'interno di < e > non c'č modo di recuperarlo.
Puoi accedervi tramite la proprieta' childNodes di DOMNode.
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 
nono, son padano, in effetti quelle parole chissà dove mi vengono fuori. 
le avrò assorbite sui NG

 
non č un nodo, č text quello che č contenuto purtroppo.
ciao
-- 
e ziocan

 alla mala parata regexp, ma non credo di dirti nulla di nuovo
proprio così ho dovcuto fare. ma è molto brutto.
ciao
-- 
e ziocan

 all'interno di < e > non c'è modo di recuperarlo.
Dentro una textarea ci puo` essere solo testo, non vengono considerati i 
tag:
http://www.w3.org/TR/html401/interact/forms.html#h-17.7
<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->
Come vedi, puoi avere solo PCDATA (quindi testo) nella textarea, quindi il 
DOM di PHP lo considera come testo e non come parte del DOM, impedendoti 
di parsarlo.
Bye.

 
e no
il punto è che "magari" lo trattasse come testo.
lui fa una cosa a metà tra credere che sia testo e ignorarlo perché è tra i
tag < >
se fosse testo andrebbe benissimo prenderlo con $node->textContent
ciao
-- 
e ziocan

 non è un nodo, è text quello che è contenuto purtroppo.
Se e' racchiuso tra <> e' un nodo. Altrimenti dovrebbe essere racchiuso
tra &gt; ed &lt;


 
se ci pensi, anche il browser in quel caso non mette un embed dentro una
textarea, ma solo del testo, fai una prova!
-- 
e ziocan

> di parsarlo.
vai a vedere che cosa fa tinymce con il dom e il POST


 vai a vedere che cosa fa tinymce con il dom e il POST
immagino che lo tramuti in &lt; &gt;
-- 
e ziocan


Example 2378. htmlspecialchars() example
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

 tra credere che sia testo e ignorarlo perché è tra i tag < >
Hai ragione. Non avevo capito bene il problema. Ora ho fatto dei test ed 
effettivamente ignora tutto quello che e` "tag", anche con un foreach sui 
child.
Apri un bugreport su 
php.net
Bye.

 una textarea, ma solo del testo, fai una prova!
Ti consiglio di ripartire dalle basi dell'XML. Se devi inserire del
testo all'interno di tag DEVE essere codificato nel modo giuto (es.
utilizzando le corrette entity) oppure devi utilizzare CDATA.


 
posso anche farlo, ma qui il problema è un altro e se non l'hai ancora
capito non ci posso fare niente.
-- 
e ziocan

 capito non ci posso fare niente.
[ti quoto]
esempio di textarea che contiene riferimento a una immagine
da mettere in un altro blog ad esempio
[...]
<textarea><img src="foobar" /></textarea>
[cut]
se il contenuto di una textarea è
all'interno di < e > non c'è modo di recuperarlo.
[/ti quoto]
[mi quoto]
Puoi accedervi tramite la proprieta' childNodes di DOMNode.
[/mi quoto]


 foreach sui child.
A me funziona perfettamente:
<pre>
<?php 
$data = '<html><body><textarea><img src="foobar"
/></textarea></body></html>';
$documentx = new DOMDocument();
$documentx->loadHTML($data);
$textareas = $documentx->getElementsByTagName("textarea");
foreach($textareas as $textarea){
	foreach($textarea->childNodes as $child) {
		echo("Name: " . $child->nodeName . "\r\n");
		echo("Src: " . $child->getAttribute('src') . "\r\n");
	}
}
?>
</pre>


 Puoi accedervi tramite la proprieta' childNodes di DOMNode. [/mi quoto]
Il problema e` proprio li`.
childNodes torna una stringa vuota quando tenti di leggere quello che e` 
contenuto tra < e >
Io ho provato con <textarea>aaa<img src="pippo" />bbb</textarea>
Il primo child e` aaa, il secondo e` stringa vuota, il terzo e` bbb.
Usando textContent viene tornato aaabbb, ignorando completamente <img...>
Bye.
Bye.

 	}
Correggo il precedente messaggio (spedito 2 minuti fa)... :/
Cosi` funziona anche a me.
Facendo invece 
print_r($textarea->firstChild);
torna stringa vuota, o meglio un DOMElement vuoto.
Bye.

 torna stringa vuota, o meglio un DOMElement vuoto.
A me funziona perfettamente anche con firstChild:
<pre>
<?php 
$data = '<html><body><textarea><img src="foobar"
/></textarea></body></html>';
$documentx = new DOMDocument();
$documentx->loadHTML($data);
$textareas = $documentx->getElementsByTagName("textarea");
foreach($textareas as $textarea){
	echo("Name: " . $textarea->firstChild->nodeName . "\r\n");
	echo("Src: " . $textarea->firstChild->getAttribute('src') . "\r\n");


 ...
Però il print_r() torna davvero un DOMElement vuoto:
$ cat foo.php 
#!/usr/bin/php
<?php
$data = '<html><body><textarea><img src="foobar" /></textarea></body></html>';  
$documentx = new DOMDocument();
$documentx->loadHTML($data);
$textareas = $documentx->getElementsByTagName("textarea");
foreach($textareas as $textarea){
	echo("Name: " . $textarea->firstChild->nodeName . "\n");
	echo("Src: " . $textarea->firstChild->getAttribute('src') . "\n");
	print_r($textarea->firstChild);
}
?>
$ ./foo.php 
Name: img
Src: foobar
DOMElement Object
(
)
$


 Però il print_r() torna davvero un DOMElement vuoto:
Questo a causa del funzionamento interno di DOM, ma non significa che
sia un nodo vuoto visto che nodeName etc. contengono dei valori.
