2010-02-19 3 views
4

Je veux remplacer la classe avec le texte div comme ceci:
Ce: <div class="grid-flags" >FOO</div>Regex Remplacer par backreference modifié par des fonctions

Devient: <div class="iconFoo" ></div>

Ainsi, la classe est remplacé par « icône ». ucfirst (strtolower (FOO)) et le texte est retiré

test HTML

<div class="grid-flags" >FOO</div> 

Motif

'/class=\"grid-flags\" \>(FOO|BAR|BAZ)/e' 

remplacement

'class="icon'.ucfirst(strtolower($1).'"' 

Ceci est un exemple d'une chaîne de remplacement I J'ai essayé de centaines apparemment. J'ai lu que le modificateur/e évalue le code PHP, mais je ne comprends pas comment cela fonctionne dans mon cas, car j'ai besoin des guillemets autour du nom de la classe, donc je suis perdu sur la façon de le faire.

J'ai essayé des variations sur le backref par exemple. strtolower ('$ 1'), strtolower ('\ 1'), strtolower ('{$ 1}')

J'ai essayé des guillemets simples et doubles et divers échappements etc et rien n'a encore fonctionné.

J'ai même essayé preg_replace_callback() sans chance

function callback($matches){ 
    return 'class="icon"'.ucfirst(strtolower($matches[0])).'"'; 
} 

Répondre

3

Il était difficile pour moi d'essayer de comprendre ce que vous vouliez dire, mais je pense que vous voulez quelque chose comme ceci:

preg_replace('/class="grid-flags" \>(FOO|BAR|BAZ)/e', 
      '\'class="icon\'.ucfirst(strtolower("$1")).\'">\'', 
      $text); 

sortie pour votre entrée exemple:

<div class="iconFoo"></div> 

Si ce ISN 't ce que vous voulez, pourriez-vous s'il vous plaît nous donner quelques exemples d'entrées et de sorties?

Et je suis d'accord que ce serait plus facile avec un analyseur HTML.

+0

Merci à tous pour vos réponses au cours du week-end. C'était la manière originale que j'essayais de faire et la plus concise, alors j'ai fait de ceci la réponse acceptée, mais vous avez tous fait des points remarquables. – Jesse

2

Au lieu d'utiliser l'option e (Valoriser), vous pouvez utiliser preg_replace_callback().

$text = '<div class="grid-flags" >FOO</div>'; 
$pattern = '/class="grid-flags" >(FOO|BAR|BAZ)/'; 
$myCB = function($cap) { 
    return 'class="icon'.ucfirst($cap[1]).'" >'; 
}; 
echo preg_replace_callback($pattern, $myCB, $text); 

Mais au lieu d'utiliser des expressions régulières, vous voudrez peut-être envisager un analyseur plus approprié pour html ou php comme simple_html_dom de DOM extension.

+0

Bonnes suggestions. Merci! – Jesse

0

Cela fonctionne pour moi

$html = '<div class="grid-flags" >FOO</div>'; 

echo preg_replace_callback(
    '/class *= *\"grid-flags\" *\>(FOO|BAR|BAZ)/' 
    , create_function('$matches', 'return \'class="icon\' . ucfirst(strtolower($matches[1])) .\'">\'.$matches[1];') 
    , $html 
); 

Juste être conscient des problèmes de parsing HTMLwith regex.

+0

Je suis maintenant au courant et je vous remercie ... – Jesse