» »

pomoč PHP in DOM elementi

pomoč PHP in DOM elementi

Matthaios ::

Naletel sem na eno težavo pri obdelavi html tagov z php-jem. Tle nisem na domačem terenu. Sem sprobu samo par stvari do zdaj. Imam slike, ki jih vstavlja wysiwyg editor. Zdaj hočem te slike narest tako da jih s pomočjo prettyPhoto prikažem v večjem merilu kot slideshow. src slike lahko preberem s tem
$doc = new DOMDocument();
@$doc->loadHTML($row['content']);
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
$tag->getAttribute('src');
}

Ne zanam pa kako sliki dodati class in pol linkom (ki sem jih že dodal pred vsako sliko) določiti href vrednost na link slike. Lahko me tudi usmerite na kakšen koristen članek (php.net ni preveč koristen vsaj ne na tej stopnji).

MrBrdo ::

MrBrdo

Matthaios ::

MrBrdo je izjavil:

http://stackoverflow.com/questions/2723...

Sem že prej na googlu zasledil ta navodila sam mi kljub temu ni ratal. Pogledal sem tudi na php.net pod setAttribute in spet nč. Tole kodo uporabljam.
$img = array( );
$doc = new DOMDocument();
@$doc->loadHTML($content);
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
	$img[] = $tag->getAttribute('src');
}
$content = str_replace("<img", "\n<br/><a href='' rel='prettyPhoto[test]' alt='' title='' width='800px' height='600px'><img", $content);
@$doc->loadHTML($content);
$tags = $doc->getElementsByTagName('a');
$i = 0;
foreach ($tags as $tag) {
	if($tag->hasAttribute('rel')){
		$tag->setAttribute('href', $img[$i]);
		$i++;
	}
}

Prebere mi link slike, doda nov link pred sliko, if stavek pogleda samo linke z 'rel' atributom. Edino kar ne deluje je nastavljanje atributa 'href' na prej prebran link slike. Kaj delam narobe?

usoban ::

kaj sploh ne spremeni href attributa? Kako pa izpises potem zadevo? Also, pri str_replace ne zapres a-tagov.

Matthaios ::

Tole je cel odsek kode
<?
		$content = "<img alt='' src='/userfiles/images/Kaystone%20tractor%20works/key%201311223469_350x246.jpg' style='width: 350px; height: 246px;' />
	<img alt='' src='/userfiles/images/Kaystone%20tractor%20works/key%20up-55F1V7EASJPISK6G_350x233.jpg' style='width: 350px; height: 233px;' />";
$img = array( );
$doc = new DOMDocument();
@$doc->loadHTML($content);
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
	$img[] = $tag->getAttribute('src');
}
$content = str_replace("<img", "\n<a href='' rel='prettyPhoto[test]' width='800px' height='600px'/><img", $content);
@$doc->loadHTML($content);
$tags = $doc->getElementsByTagName('a');
$i = 0;
foreach ($tags as $tag) {
	if($tag->hasAttribute('rel')){
		$tag->setAttribute('href', $img[$i]);
		$i++;
	}
}
echo $content;
?>

tole pa pride vn
<html>
	<head>
	
	</head>
	<body>
		
<a href='' rel='prettyPhoto[test]' width='800px' height='600px'/><img alt='' src='/userfiles/images/Kaystone%20tractor%20works/key%201311223469_350x246.jpg' style='width: 350px; height: 246px;' />
	
<a href='' rel='prettyPhoto[test]' width='800px' height='600px'/><img alt='' src='/userfiles/images/Kaystone%20tractor%20works/key%20up-55F1V7EASJPISK6G_350x233.jpg' style='width: 350px; height: 233px;' />	</body>
</html>

Res mi ni jasn kje je napaka. (vem da bo na konc kej banalnega)

usoban ::

Kolkor vidim ne izpises posodobljenega dokumenta. Na koncu namesto
echo $content
daj
echo $doc->saveXml() 


Pa se enkrat,
<a>
taga ne zakljucis. Glede na to,da si se lotil vstavljanja kar s str_replace, ga spremeni v
$content = str_replace(array("<img", "</img>"), array("\n<a href='' rel='prettyPhoto[test]' width='800px' height='600px'/><img", "</img></a>"), $content);

Zgodovina sprememb…

  • spremenil: usoban ()

MrBrdo ::

Ja no če že parsaš DOM bi se spodobilo da nebi s str_replace tega delal :)
MrBrdo

Matthaios ::

usoban je izjavil:

Kolkor vidim ne izpises posodobljenega dokumenta. Na koncu namesto
echo $content
daj
echo $doc->saveXml() 

Hja :( sm vedu da je kakšna neumna napaka. Zdaj pa dela. Sm tud tist str_replace umaknu tko da zgleda velik lepš
$doc = new DOMDocument();
$doc->loadHTML($content);
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
	$link = $doc->createElement('a');
	$link->setAttribute('rel','prettyPhoto[test]');
	$element = $tag->parentNode->insertBefore($link,$tag);
	$element->setAttribute('href',$tag->getAttribute('src'));
	$element->appendChild($tag);
}
echo $doc->saveHTML();

Edin ne vem kako to vrinit v obstoječo html kodo brez da mi da html tag. To naj bi pri shranjevanju vnosa v bazo vklopilo prettyPhoto funkcijo. In ta koda bo na strani izpisana znotraj div elementa tko da ne rabim še enkrat html in body tag-e.

MrBrdo ::

Off-topic, k sm lih danes nekaj delal podobnega, v Rubyju bi to tko zgledal:
puts Nokogiri::HTML(content).tap { |doc|
  doc.css('img').each { |e| e.before(doc.create_element('a', rel: 'prettyPhoto[test]', href: e['src']).add_child(e.dup).parent) }
}.to_html

I love Ruby :)
MrBrdo

MrBrdo ::

Matthaios drugače pa poglej, če lahko rečeš elementu body, da ti vrne html (getElementsByTagName('body')).
MrBrdo


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Web crawler

Oddelek: Programiranje
71392 (525) b3D_950
»

Slo-Tech userscripts

Oddelek: Izdelava spletišč
174974 (2426) jype
»

[Java]Shranjevanje/Branje nastavitev za povezavo z podatkovno bazo

Oddelek: Programiranje
192411 (2185) KernelPanic
»

getElementsByTagName ne dela v Chromu

Oddelek: Programiranje
141593 (1331) win64
»

PHP XML->attributes

Oddelek: Programiranje
51279 (1215) keworkian

Več podobnih tem