2009-07-28 4 views
1

J'ai besoin d'une expression régulière qui extrait spécificateur de type (comme% d,% s) à partir d'une chaîne.expression régulière pour spécificateur de type en php

<? 
    $price = 999.88; 
    $str = "string"; 
    $string = "this is a %f sample %'-20s,<br> this string is mixed with type specifier like (number:%d's)";   
    //output 1 :echo sprintf($string,$price,$str,500); 
    //output 2 should be $string replaced by [#] 
    ?> 

sortie 1

this is a 999.880000 sample --------------string, 
this string is mixed with type specifier like (number:500's) 

je veux remplacer tous ces spécificateurs de type avec [#]. comment écrire une expression régulière pour les spécificateurs de type.

ce que je dois est

sortie 2

this is a [#] sample --------------[#], 
this string is mixed with type specifier like (number:[#]'s) 

Répondre

2

Pascal m'a battu, mais voici ma regex pas très bien testée.

'/%(?:(?<swap_position>[0-9]+)\$)?(?<sign>-|\+)?(?<padding>\'.|0|[[:space:]])?(?<alignment>-?)(?<width>[0-9]+)?(?:\.(?<precision>[0-9]+))?(?<type>[%bcdeufFosxX])?/m'; 

Je serais inquiet que tout en convertissant à # vous perdez les informations où quelqu'un a troqué l'ordre à l'aide de 2 $, 1 $ etc.

Je voulais faire en sorte que si vous capturez un caractère de remplissage personnalisé préfixé par une citation, cette citation ne serait pas capturée, mais je ne pouvais pas le résoudre.

+0

@ Tom-haigh: laissez-moi vérifier avec votre expression, je vous le ferai savoir .. – coderex

+0

oui cela fonctionne, y at-il des exceptions sur votre expression? ;) parce que je ne suis pas au courant de cette expression. où vous les gars avez appris ces informations s'il vous plaît me parler de certaines bonnes ressources. – coderex

+0

Vous trouverez les exceptions lorsque vous le testerez. Je l'ai testé un peu, mais pas beaucoup donc je ne fais aucune garantie .. –

1

est tout simplement pas très bien testé, mais ce quelque chose comme ceci:

$format = "this is a %f sample %'-20s,<br> 
this string is mixed with type specifier like (number:%d's)"; 

$result = preg_replace("#(%[+-]?(([ 0]?)|('.)))-?(\d*)(\.\d*)?[%bcdeufFosxX]#", '[#]', $format); 

var_dump($result); 

Et le résultat vous obtenez est:

string 'this is a [#] sample [#],<br> 

this string is mixed with type specifier like (number:[#]'s)' (length=92) 

Lequel ressemble un peu à la chaîne que vous demandiez.


Selon la documentation de sprintf, le format doit être:

  • % signe
  • spécificateur signe optionnel: + ou -
  • option spécificateur de rembourrage: '' ou '0'
    • Un autre caractère de remplissage peut être spécifié en le préfixant avec un seul guillemet (')
  • spécificateur d'alignement en option: rien ou « - »
  • nombre facultatif, un spécificateur de largeur
  • en option spécificateur de précision: période («.) Suivi d'une chaîne de chiffres décimaux en option
  • spécificateur de type: une caractère parmi les permis

Ce que j'ai essayé de faire correspondre avec cette regex ^^


H ope cela aide! Amusez-vous ^^

+0

oui homme son travail ... Merci :) – coderex

+0

Vous êtes :-) Bienvenue (BTW, il y a definitly doit y avoir un moyen de rendre cela plus facile à lire/comprendre/maintenir, comme le fractionnement du regex dans plusieurs lignes, une pour chaque numéro sur la page de documentation de sprintf ... Cela peut probablement être fait avec un modificateur pour la regex: mabye 'x'; voir http://fr3.php.net/manual/fr/reference.pcre.pattern .modifiers.php pour plus d'informations ;-)) –

+0

un doute de plus,% 1 $ d est ce format fonctionne ?? – coderex

Questions connexes