aide pour une petite regex

VaN
Mammouth du PHP | 1107 Messages

04 févr. 2011, 18:20

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 : )

ViPHP
ViPHP | 5462 Messages

04 févr. 2011, 18:22

toujours pareil :wink:

pour parser du HTML c'est avec DOMDocument

VaN
Mammouth du PHP | 1107 Messages

04 févr. 2011, 18:42

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 ?

ViPHP
ViPHP | 5462 Messages

04 févr. 2011, 18:44

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
        )

)
*/

VaN
Mammouth du PHP | 1107 Messages

04 févr. 2011, 18:58

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 ?

ViPHP
ViPHP | 5462 Messages

04 févr. 2011, 19:02

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));

VaN
Mammouth du PHP | 1107 Messages

07 févr. 2011, 10:39

Super, merci. je passe le thread en Résolu.