2010-06-24 8 views
1

je besoin d'un expresssion PCRE (regex) et à remplacer un attribut et de valeur liée à un élément de balisage, quelque chose comme ceci:PCRE remplacer le style de balisage

<div style="width:200px;"></div> 

dans

<div style="width:100px;"></div> 

Qu'est-ce que Je suis maintenant, analysé par simplehtmldom est le contenu de style en texte clair, comme ceci:

width:200px; 

Comment puis-je faire correspondre l'attribut CSS et le remplacer par les nouvelles valeurs en PHP?

À la votre!

+0

Quels paramètres transmettez-vous, 'width' et' 100px'? – serg

+0

la valeur seulement .. Je veux trouver un attribut et remplacer sa valeur – yoda

Répondre

2
([^\s:]+)[\s:]+([^:;]+) 

va extraire les valeurs dans le côlon en backreferences 1 et 2.

([^\s:]+)[\s:]+(\d+)(\w+) 

va faire la même chose mais extraire la valeur (200) et l'unité (px) séparément.

if (preg_match('/([^\s:]+)[\s:]+(\d+)(\w+/', $subject, $regs)) { 
    $attribute = $regs[1]; 
    $value = $regs[2]; 
    $unit = $regs[3]; 
} else { 
    // no match 
} 
+1

+1 C'est une bonne solution, mais il ne peut pas faire face à un espace après les deux points, ce qui est assez commun. Cela devrait le trier: '/ ([^ \ s:] +) [\ s:] * (\ d +) (\ w +) /' – Mike

+1

Merci - J'ai édité ma réponse. J'ai utilisé '[\ t]' au lieu de '\ s' pour être un peu plus explicite - ou pourrait-il y avoir même des retours à la ligne? –

+0

Bonne question. Je n'ai pas vérifié les spécifications, mais je viens de modifier quelques CSS sur l'une de mes pages de test. Les nouvelles lignes avant et après les deux points ne semblent pas déranger Firefox du tout, donc je pense que le chemin à parcourir est moins explicite. – Mike

-2
preg_replace('~width:200px~', 'width:100px', $subject); 
+1

qui ne fonctionne que si l'attribut et la valeur sont censés être comme ça. – yoda

Questions connexes