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.
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;
}