bonjour à tous!
je souhaite ecrire une function qui parse du contenu html
et retourne les paires clé/valeur d'attributs d'une balise donnée.
je sais egalement que domdocument fait le boulot, mais pas lorsque la page contient des balises personnalisées.
alors j'ai fais ceci:

$tag ='iriven:doc';
$subject='<iriven:doc id="showcase" cLass="mAin" style="height:200px;">';
if (preg_match('/<'.$tag.'((\s(.*)=]("\'])(.*)\\4)+)>$/Usi', $subject,$matches)) {
    # Successful match
    echo '<pre>';
    print_r($matches);
    echo '</pre>';
} else {
    # Match attempt failed
    echo 'bad';

et son execution me retourne ceci:

Array
(
    [0] => 
    [1] => id="showcase" cLass="mAin" style="height:200px;"
    [2] => style="height:200px;"
    [3] => style
    [4] => "
    [5] => height:200px;
)

et je souhaiterai modifier la regex de maniere à ce qu'elle
me retourne un truc du genre:

Array
(
    [0] => id="showcase" cLass="mAin" style="height:200px;"
    [1] => Array(
                         [0] =>id="showcase"
                         [1] =>cLass="mAin"
                         [2] =>style="height:200px;"
                )
)
ou tout simplement:
Array
(
    [0] => id="showcase" cLass="mAin" style="height:200px;"
    [1] => Array(
                         [id] =>"showcase"
                         [cLass] =>"mAin"
                         [style] =>"height:200px;"
                )
)

mais je ne vois pas comment m'y prendre .
merci de votre aide.

1 réponse


iriven
Auteur
Réponse acceptée

finalement j'y suis parvenu mais espere que quelqu'un me proposera une solution (regex) plus optimisée:

function getTagAttributes($tag,$subject){
if (!preg_match('/<'.$tag.'((\s(.*)=]("\'])(.*)\\4)+)>$/Usi', $subject,$matches)) return false;
    $matches=explode(' ',trim($matches[1]));
    $attributes = array();
    foreach($matches as $key=>$value)
    {
        if(!stripos($value,'=')) continue;
        $value = explode('=',$value);
        $attributes[trim($value[0])] = trim($value[1]);
    }
    return $attributes;
}

dans la version ci-dessus vu que l'expression reguliere ne capture pas directement les paires clé/valeur(ce qui était mon but au depart) je l'ai remené à quelque chose de beaucoup plus simple:

function getTagAttributes($tag,$subject,$closing=null){
    $openning = '<';
    $closing = !is_null($closing)?(trim($closing)!=='/>'? '>' : $closing): '>';
    if(!preg_match('/'.$openning.$tag.'(.*)'.$closing.'$/', $subject,$matches)) return false;
    $matches=explode(' ',trim($matches[1]));
    $attributes = array();
    foreach($matches as $key=>$value)
    {
        if(!stripos($value,'=')) continue;
        $value = explode('=',$value);
        $attributes[trim($value[0])] = trim($value[1]);
    }
    return $attributes;
}