PHP nettoyer une chaîne

  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Octobre 16th, 2009, 9:04 am

J'ai quelques données Im immersion dans MySQL à partir d'Excel qui correspond tout simplement un nom d'élément et de coût.

Le problème est le coût.

Parfois, le coût est par exemple:

125,88 (ce qui est parfait)...mais parfois, les employés ont estimé le coût pour tenir compte de l'unité de mesure....

125.88M
125.88C
et même une fois utilisé une barre oblique, comme
125.88 / M

Je fait des tonnes de manipulations de corde mais celui-ci est sur écoute moi. La plupart du temps regex Ive ou str_split ou exploser ou substr que je peux écrire à Débarrassez-vous du M, C, ou / M, mais je fais voulu garder ces valeurs et les utiliser. Str_split semblait être bonne, mais je n'avais pas de séparateur?? Plus le M / on va être rude. Toute suggestion ou l'aide sur la façon de modifier une chaîne mais conserver les données devraient être supprimées. thnx.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Octobre 16th, 2009, 9:04 am

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Octobre 16th, 2009, 2:04 pm

Je voudrais utiliser preg_match.

C'est le modèle dont je commencerais par la fonction de ce que la lecture Im. $ matches contiendra la chaîne complète, le nombre, et le suffixe. Dans cet ordre.
Code: [ Select ]
$matches = array();
preg_match('#^([\d.]+)(/?[MC])?$#', $str, $matches);
  1. $matches = array();
  2. preg_match('#^([\d.]+)(/?[MC])?$#', $str, $matches);
Strong with this one, the sudo is.
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Octobre 16th, 2009, 2:42 pm

Joebert Thnx, Im allons travailler avec pregex que vous m'avez donné à tout simplement le texte suivant que je mijote.


Première obtenir exactement la chaîne décimale
Code: [ Select ]
$cost = "111.11/M";
$findme = ".";
$pos1 = strpos($cost, $findme);
$totpos = strlen($cost);
$strcheck = $totpos - $pos1;
if ($strcheck != 3) {
    $countbackpos = 3 - $strcheck;
}
$fixedcost = substr($cost, 0, $countbackpos);
  1. $cost = "111.11/M";
  2. $findme = ".";
  3. $pos1 = strpos($cost, $findme);
  4. $totpos = strlen($cost);
  5. $strcheck = $totpos - $pos1;
  6. if ($strcheck != 3) {
  7.     $countbackpos = 3 - $strcheck;
  8. }
  9. $fixedcost = substr($cost, 0, $countbackpos);


Suivant j'ai l'U / M que certains idiot attaché à l'extrémité.

Code: [ Select ]
function getuom($hay) {
  $k = array('M','/M','m','C','c');
    foreach ($k as $value) {
    $check_uom = strpbrk($hay, $value);
    if ($check_uom != false) {
        return $check_uom;
        }
    }
}

$uom = getuom($cost);
  1. function getuom($hay) {
  2.   $k = array('M','/M','m','C','c');
  3.     foreach ($k as $value) {
  4.     $check_uom = strpbrk($hay, $value);
  5.     if ($check_uom != false) {
  6.         return $check_uom;
  7.         }
  8.     }
  9. }
  10. $uom = getuom($cost);


J'ai implémenté dans mon script principal, mais ses erreurs en donnant My SQL, mais son travail sur un fichier test j'ai fait donc je pense Im sur la bonne voie. Cependant, je tiens à mess avec cette pregex pour voir si il ne sera pas rendre les choses plus faciles et les retouches plus précises pour le volume de lecture à travers inserts Im. Cela devrait me faire rouler plus mais d'autres suggestions would be nice. Plus je travaille sur cela, je réalise que je n'ai vraiment pas jamais séparé d'une chaîne et effectivement gardé des caractères individuels. J'ai toujours été d'enlever uniquement / suppression indésirables / caractères inutiles. Je suppose que je pourrais toujours utiliser un tableau de chaînes cause chaque caractère de la variable $ des coûts devrait être référencé par $ Coût [0], coût $ [1], etc Ive a également vérifié les données et le maximum que je doit s'occuper en est soit 1 ou 2 caractères supplémentaires après les centimes qui doit toujours être M, M, / M, C / C, C et bien le C / C et minuscules n'ont jamais été utilisées, mais j'ai jeté dans à peut-être de déceler les erreurs futures.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Octobre 16th, 2009, 5:48 pm

J'aime utiliser preg_ * fonctions parce que ses facile de travailler dans différents formats sur la route. À peu près chaque fois que j'ai commencé avec quelque chose, je finis par rencontrer les instances freak bas de la route et quand je viens de modifier un modèle regex ceux-ci sont faciles à traiter.

Si vous êtes sûr theres aucun des espaces au début des chaînes de caractères, et que les premiers caractères N seront ceux que vous voulez, theres le strspn fonction.

Dans les conditions que j'ai décrites, cette fonction se terminera par revenir à la position du caractère superposés en premier. Techniquement, son retour de la longueur de la partie de la chaîne que vous voulez.

Par exemple, si vous avez la chaîne "12,34 / m" ou "12.34m", dans les deux cas strspn Réservé aux chiffres et d'un point reviendrait 5.

PHP Code: [ Select ]
<?php
 
$str = array(
   '12.34m',
   '12.34/m',
   '12.34M'
);
 
foreach($str as &$s)
{
   echo "$s: " . substr($s, 0, strspn($s, '1234567890.')) . "\n";
}
 
?>
  1. <?php
  2.  
  3. $str = array(
  4.    '12.34m',
  5.    '12.34/m',
  6.    '12.34M'
  7. );
  8.  
  9. foreach($str as &$s)
  10. {
  11.    echo "$s: " . substr($s, 0, strspn($s, '1234567890.')) . "\n";
  12. }
  13.  
  14. ?>
Strong with this one, the sudo is.
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Octobre 17th, 2009, 9:20 am

Ahh, oui c'est ce que Im recherchez. Thats got it. strspn est exactement ce dont j'avais besoin. thnx.

Afficher de l'information

  • Total des messages de ce sujet: 5 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 292 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC