Page 1 sur 1

aide pour une petite regex

Posté : 04 févr. 2011, 18:20
par VaN
Bonjour à tous,

je récupère un string de ma base de données, que voici :
<font class="size4">Journaux</font><font class="size2">d'entreprise</font><font class="size3">Référentiels</font><font class="size1">de connaissances</font>
Au final, j'aimerai arriver à un tableau de ce style :

Array(
[0] => Array("word" => "Journaux", "size" => "size4")
[1] => Array("word" => "d'entreprise", "size" => "size2")
[2] => Array("word" => "Référentiels", "size" => "size3")
[3] => Array("word" => "de connaissances", "size" => "size1")
)

Comment puis-je m'y prendre ?
Mon idée est de d'abord couper le string en 4 morceaux, puis d'appliquer une regex sur chaque, pour récupérer les 2 variables qui m'intéressent, mais je ne sais pas comment faire.

Merci d'avance : )

Re: aide pour une petite regex

Posté : 04 févr. 2011, 18:22
par stealth35
toujours pareil :wink:

pour parser du HTML c'est avec DOMDocument

Re: aide pour une petite regex

Posté : 04 févr. 2011, 18:42
par VaN
je viens d'aller voir la doc PHP là dessus, mais je ne vois pas bien ce qui peut m'aider dans ces différentes fonctions : / Tu peux m'éclairer ?

Re: aide pour une petite regex

Posté : 04 févr. 2011, 18:44
par stealth35
je viens d'aller voir la doc PHP là dessus, mais je ne vois pas bien ce qui peut m'aider dans ces différentes fonctions : / Tu peux m'éclairer ?
c'est de la manipulation de DOM classique :
$source = <<<HEREDOC
<font class="size4">Journaux</font>
<font class="size2">d'entreprise</font>
<font class="size3">Référentiels</font>
<font class="size1">de connaissances</font>
HEREDOC;

$doc = new DOMDocument();
$doc->loadHTML($source);

$nodes = $doc->getElementsByTagName('font');
$list  = array();

foreach($nodes as $node)
{
    $list[] = array(
                'word' => $node->nodeValue, 
                'size' => $node->getAttribute('class')
              );
}

print_r($list);
/*
Array
(
    [0] => Array
        (
            [word] => Journaux
            [size] => size4
        )

    [1] => Array
        (
            [word] => d'entreprise
            [size] => size2
        )

    [2] => Array
        (
            [word] => Référentiels
            [size] => size3
        )

    [3] => Array
        (
            [word] => de connaissances
            [size] => size1
        )

)
*/

Re: aide pour une petite regex

Posté : 04 févr. 2011, 18:58
par VaN
Merci. pendant le même temps, je faisais à peu près la même chose de mon côté, en cherchant un peu (je connaissais pas ->nodeValue par exemple).
// Récupération du tagcloud
$tagcloud = get_value_from_query("SELECT tagcloud_content FROM `tagcloud` WHERE tagcloud_id = 1", $connection);

$doc = new DOMDocument();
$doc->loadHTML($tagcloud);

$searchNode = $doc->getElementsByTagName( "font" ); 

$tagcloud_rows = array();

foreach( $searchNode as $searchNode ) {
	$tagcloud_rows[] = array("word" => utf8_decode($searchNode->nodeValue), "size" => $searchNode->getAttribute('class'));
} 
print_r_pre($tagcloud_rows);
Par contre, je suis obligé de placer un utf8_decode() sur $searchNode->nodeValue : / Y'aurait pas moyen de faire ça plus proprement, en spécifiant l'encodage de l'HTML qu'on parse ?

Re: aide pour une petite regex

Posté : 04 févr. 2011, 19:02
par stealth35
DOMDocument travail en UTF-8 en interne, mais un HTML sans charset est considéré comme du iso-8859-1 par défaut

il faut donc faire :
$charset = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';

$doc->loadHTML($charset . $source);
ou
$doc->loadHTML(utf8_decode($source));

Re: aide pour une petite regex

Posté : 07 févr. 2011, 10:39
par VaN
Super, merci. je passe le thread en Résolu.