PHP limpiar una cadena de

  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de Usuario
  • Registrado: Nov 18, 2007
  • Mensajes: 429
  • Status: Offline

Nota Octubre 16th, 2009, 9:04 am

Tengo algunos datos de Im de dumping en MySQL de Excel que básicamente consiste en un nombre de elemento y su coste.

El problema es con el costo.

A veces, el costo es por ejemplo:

125.88 (que es perfecto)...pero a veces los empleados han calculado que el coste para reflejar la unidad de medida....

125.88M
125.88C
e incluso una vez utilizó una barra como
125,88 / M

He hecho de toneladas de manipulación de cadenas, pero ésta me molesta. La mayoría del tiempo o regex Ive str_split o explotar o substr que puedo escribir deshacerse de la M, C o / M pero yo quería un poco para mantener esos valores y usarlos. Str_split parecía estar bien, pero yo no tenía delimitador?? Además el M / se va a ser difícil. Cualquier sugerencia o ayuda sobre cómo editar una cadena, pero mantener los datos que se retira. thnx.
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Octubre 16th, 2009, 9:04 am

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Octubre 16th, 2009, 2:04 pm

Yo usaría preg_match.

Este es el patrón que se iniciaría con la lectura sobre la base de lo que soy. $ coincidencias contendrá la cadena completa, el número, y el sufijo. En ese orden.
Código: [ 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 Usuario
  • Registrado: Nov 18, 2007
  • Mensajes: 429
  • Status: Offline

Nota Octubre 16th, 2009, 2:42 pm

Joebert Thnx, Im que va a trabajar con esa pregex que me dieron de la siguiente simplemente que me cocinó.


En primer lugar obtener sólo la cadena decimal
Código: [ 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);


Siguiente tengo la U / M que algún idiota adjunta al final.

Código: [ 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);


He implementado en mi script principal, pero sus errores dando en My SQL, pero su trabajo en un archivo de prueba que hice lo que creo que soy en el camino correcto. Sin embargo, quiero ensuciar con que pregex para ver si no va a facilitar las cosas y de las ediciones más exacta para el volumen de inserciones de lectura a través de Im. Esto debería hacerme rodar más, pero cualquier otra sugerencia sería agradable. Más que trabajo en esto me doy cuenta de que realmente no haya separado de una cadena y, de hecho mantiene los caracteres individuales. Siempre me acaba de quitar / borrar no deseados caracteres innecesarios. Creo que siempre podría usar una matriz de cadenas causa cada carácter en la variable $ coste debería hacer referencia a costo $ [0], costo $ [1], etc Ive También se verificaron los datos y lo más que se trata es de bien 1 o 2 caracteres adicionales después de los centavos que deben ser siempre H, M, / M, C / C, c, y realmente la C / c minúscula y nunca se usaron pero tiró a lo mejor para detectar errores de futuro.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Octubre 16th, 2009, 5:48 pm

Me gusta usar preg_ * funciones debido a su fácil trabajar en diferentes formatos en el camino. Casi cada vez que empezar con algo, me acaban encontrar instancias freak en el camino y cuando tengo que cambiar un patrón de expresión regular esos son fáciles de tratar.

Si está seguro de theres ningún espacio al comienzo de las cuerdas, y que los primeros caracteres N serán los que usted quiere, los theres de la strspn función.

En las condiciones que he descrito, que la función termina devolviendo la posición del carácter litera primero. Técnicamente, su retorno de la longitud de la parte de la cadena que desee.

Por ejemplo, si usted tiene la cadena "12,34 / m" o "12.34m", en ambos casos strspn restringido a los números y un punto volvería 5.

PHP Código: [ 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 Usuario
  • Registrado: Nov 18, 2007
  • Mensajes: 429
  • Status: Offline

Nota Octubre 17th, 2009, 9:20 am

Ahh, sí que soy es lo que busca. Eso es lo consiguió. strspn es exactamente lo que necesitaba. thnx.

Publicar Información

  • Total de mensajes en este tema: 5 mensajes
  • Usuarios navegando por este Foro: Kurthead+1, Zealous y 135 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC