2011-07-12 6 views
1

J'ai besoin d'une recherche d'expression régulière et remplacer que je suis un peu coincé.PHP Rechercher et remplacer la fonction

Fondamentalement, j'ai une table avec plusieurs de dans chaque <td> j'ai un <img>

Je dois copier la largeur et la hauteur de la <img> et placez-le dans le <td>

<td> Je été fait manuellement, mais le nombre de <td> est de plus en plus et sa prise à long.

J'ai juste besoin d'aide pour faire la découverte réelle et remplacer

des idées?

- EDIT -

Merci pour les conseils, pense que je vais aller dans le sens de dom que je connais mieux. J'ai fait un reg avant de faire une tâche qui était une idée beaucoup plus simple, alors je suis parti de là. Vous m'avez sauvé du temps

+0

do u faire chaîne concaténation ne importe où? – Sudantha

+4

cela serait probablement plus facile et plus robuste si vous utilisiez la classe DOMDocument plutôt que d'essayer la manipulation de chaînes. – Spudley

+1

Ne pas utiliser une expression régulière pour l'analyse html php ... a un beau couple parseurs XML, je suis personnellement fan de http://us2.php.net/manual/en/book.simplexml.php –

Répondre

1

Vous devriez envisager d'utiliser la classe DOMDocument fournie par PHP.

Exemple:

<?php 

$doc = new DOMDocument; 
$doc->loadHTMLFile('/path/to/file.html'); 

// Find the TD elements. 
$tds = $doc->getElementsByTagName('td'); 

// If TD elements were found, loop through each one of them. 
if (! empty($tds)) 
    foreach ($tds as $td) 
    { 
    // Find the IMG elements located inside that TD 
    $imgs = $td->getElementsByTagName('img'); 

    // Find the style attribute of the TD just in case one already exists. 
    $style = $td->getAttribute('style'); 

    // I'm not sure what to do if multiple images are found so instead of looping to many, make sure only 1 is found. 
    if (! empty($imgs) && count($imgs) == 1) 
    { 
     $height = $imgs->item(0)->getAttribute('height'); 
     $width = $imgs->item(0)->getAttribute('width'); 

     if (! empty($height)) 
     $style .= 'height:' . $height . 'px;'; 

     if (! empty($width)) 
     $style .= 'width:' . $width . 'px;'; 

     // Update the style attribute of the TD element. 
     $td->setAttribute('style', $style); 
    } 
    } 

// Save the HTML document. 
$doc->saveHTMLFile('/path/to/newfile.html'); 

Mises à jour:

<html> 
    <body> 
    <table> 
     <tr> 
     <td><img src="test.png" height="100" width="100" /></td> 
     <td> 
      <p><img src="test2.png" height="100" /></p> 
     </td> 
     </tr> 
    </table> 
    </body> 
</html> 

À:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
    <body> 
    <table> 
     <tr> 
     <td style="height:100px;width:100px;"><img src="test.png" height="100" width="100"></td> 
     <td style="height:100px;"> 
      <p><img src="test2.png" height="100"></p> 
     </td> 
     </tr> 
    </table> 
    </body> 
</html> 
+0

Parfait. Merci pour votre aide, m'a sauvé beaucoup de maux de tête – atmd

0

Vous pouvez le faire sans les expressions régulières. Essayez quelque chose comme ceci:

var images = document.getElementsByTagName('img'); 
for(var i=0, j=images.length; i<j; i++){ 
    images[i].parentNode.setAttribute('height', images[i].height); 
    images[i].parentNode.setAttribute('width', images[i].width); 
} 

Le script suppose que vous n'avez aucune image autre que celle mentionnée ci-dessus.

+2

La question est étiquetée [tag: php] et non [tag: javascript]. – kapa

+0

Im obtenir "document.getElementsTagName n'est pas une fonction" erreur sur celui-ci. – atmd

+0

@DAVIEAC - Il devrait être 'document.getElementsByTagName' (il manque le By). –

0

Essayez quelque chose comme ceci:

preg_replace('/<td>(.*?)<img(.*?)width=\"(\d+)(.*?)height=\"(\d+)(.*?)<\/td>/','<td width="${3}" height="${5}">${1}<img${2}width="${3}${4}height="${5}${6}</td>', $html); 

largeur et la hauteur de l'interrupteur si nécessaire =)