2012-12-19 2 views
3

J'ai un code HTML <img> avec un attribut "alt". Mon <img> est enveloppé dans un <a>. Le <a> a un attribut "title". Par exemple:Lecture d'un attribut d'une balise HTML et écriture dans un attribut d'une autre balise HTML

<a title="" href ="page.html"><img src="image.jpg" alt="text"></a> 

Je dois lire la valeur de l'attribut « alt » du <img> et écrire à la valeur d'attribut « title » du <a>. Existe-t-il un moyen de le faire en PHP?

+2

Oui, il existe un moyen, par exemple DOM. Qu'avez-vous essayé? –

+0

Si vous restituez le tout via PHP, pourquoi ne pouvez-vous pas simplement rendre l'attribut alt pour les deux balises? – techfoobar

+3

ce serait beaucoup plus facile/plus rapide si vous utilisez jquery/javascript pour cela. Si vous utilisez PHP, alors aussi, il vaut mieux avoir l'identifiant de chaque élément de html pour choisir le bon titre. –

Répondre

2

vous pouvez le faire en php

$url="http://example.com"; 

$html = file_get_contents($url); 

$doc = new DOMDocument(); 
@$doc->loadHTML($html); 

$tags = $doc->getElementsByTagName('img'); 

foreach ($tags as $tag) { 
     echo $tag->getAttribute('alt'); 
} 
+0

OK merci, cela me donne la valeur d'attribut 'alt' d'une image donnée. Ensuite, je dois écrire cette valeur dans l'attribut 'title' de sa balise d'ancrage environnante. Une idée? –

+0

Merci de m'avoir décampé avec ce NullPointer! Martinqt a réussi à compléter la solution. À votre santé!! –

0

Vous pouvez essayer avec JQUERY,

<script> 
    var altValue = $('img').attr('alt'); 
    $('a').attr('title', altValue); 
</script> 

Vous devez utiliser lorsque vous avez besoin sur onClick et si vous avez plus img et une étiquette comme suit

<script> 
    function changeTitle(this) { 
     var altValue = $(this).find('img').attr('alt'); 
     $(this).find('a').attr('title', altValue); 
    } 
</script> 
+0

Merci pour ce Vinoth, alors que votre solution aiderait sur une page Web. Dans mon cas, je fais un traitement de chaîne sur le backend. Merci quand même!!! –

0

PHP est un langage côté serveur. Ainsi, une fois la sortie rendue, vous ne pouvez plus la modifier. (Sauf si vous téléchargez le contenu avec PHP puis sortir les données modifiées, mais qui ne semble utile si vous ne pouvez pas accéder à la source Orignal) Si vous créez la sortie en php, vous pouvez utiliser:

$alt = 'text'; 
echo '<a title="'.$alt.'" href ="page.html"><img src="image.jpg" alt="'.$alt.'"></a>'; 

Si vous avez déjà que la sortie, vous pouvez utiliser jquery (http://jquery.com/)

<script type='text/javascript'> 
//perform after page is done 
$(function() { 

    //each image in an a tag 
    $('a img').each(function() { 
    var $el = $(this); 
    var alt = $el.attr('alt'); 
    $el.parent('a').attr('title', alt); 
    }); 
}); 
</script> 

Mise à jour

Si la modification de chaîne pure PHP, vous pouvez également utiliser une expression régulière pour changer, au lieu de la manipulation de dom:

$string = '<a title="" href ="page.html"><img src="image.jpg" alt="text"></a>'; 
$pattern = '/<a(.*?)title="(.*?)"(.*?)<img(.*?)alt="(.*?)"(.*?)<\/a>/i'; 
$replacement = '<a${1}title="$5"${3}<img${4}alt="${5}"${6}</a>'; 
echo preg_replace($pattern, $replacement, $string); 
+0

Merci pour ce Hugo, une solution très concise! Alors que cela aiderait sur une page Web. Dans mon cas, je fais un traitement de chaîne sur le backend. –

+0

Ah ok, mis à jour avec certains preg_replace, même si vous avez déjà votre awnser. –

0

Bien que la question est marqué , je pensais que je vous offre un moyen simple, plaine JavaScript, des moyens de faire la même chose côté client:

function attributeToParent(tag, from, to, within) { 
    if (!tag || !from || !to) { 
     return false; 
    } 
    else { 
     within = within && within.nodeType == 1 ? within : document; 
     var all = within.getElementsByTagName(tag); 
     for (var i = 0, len = all.length; i < len; i++) { 
      if (all[i].getAttribute(from) && all[i].parentNode.tagName.toLowerCase() !== 'body') { 
       all[i].parentNode.setAttribute(to, all[i].getAttribute(from)); 
      } 
     } 
    } 
} 

attributeToParent('img', 'alt', 'title');​ 

JS Fiddle demo.

Cela pourrait être rangé un peu, mais je pense que c'est relativement clair comme il est (même si un peu plus désordonné que je le voudrais).

Références:

+0

Merci David! J'ai besoin de cela pour faire partie d'un processus de backend cependant. Je fais face à un morceau de HTML à partir d'une exportation Fireworks en HTML. J'ai besoin d'exécuter ce HTML à travers un script pour le ranger un peu. Bravo pour la solution Javascript. –

+0

De rien! J'ai supposé que ce serait probablement une chose côté serveur, mais j'ai vu les réponses jQuery (quelque peu inutilement), et je voulais offrir une alternative JavaScript simple. –

1

Comme commencé par NullPointer,

$url="http://example.com"; 

    $html = file_get_contents($url); 

    $doc = new DOMDocument(); 
    @$doc->loadHTML($html); 

    $tags = $doc->getElementsByTagName('img'); 

    foreach ($tags as $tag) { 
    $parent = $tag->parentNode; 
    if($parent->nodeName == 'a') { 
     $parent->setAttribute('tittle', $tag->getAttribute('alt')); 
    } 
    } 

Hope it helps

+1

Excellent martinqt !! Merci beaucoup pour ça, ça m'a énormément aidé! –

+0

De rien. – martinqt

Questions connexes