I-NOZex Posted March 10, 2014 Report Share Posted March 10, 2014 Boas, tenho a seguinte função para transformar uma string, num formato MYSQL TIME correcto (HH:MM:SS) o que venho aqui perguntar é uma forma de fazer melhor possivelmente, pois embora funcione, acho que fiz de forma um pouco arbitrária aqui fica a função: public function parseLength($length){ $length = preg_replace("/^([\d]{1,2})\[\d]{2})$/", "00:$1:$2", $length); sscanf($length, "%d:%d:%d"); return date('H:i:s',strtotime($length)); } o que preciso é que pegue em strings num destes possiveis formatos: 01:23:45 00:12:34 12:34 2:34 e que converta no HH:MM:SS correspondente: 01:23:45 00:12:34 00:12:34 00:02:34 e já agora, qual a melhor maneira de fazer "trim" aos 00 inutilizados? digo, imaginando que temos a string 00:02:34, mostrar apenas 02:34 obrigado, isto sao coisas que já fiz, mas quero reavaliar se existe uma melhor forma, obrigado 🙂 B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 10, 2014 Report Share Posted March 10, 2014 (edited) uma solução : <?php echo "<pre>"; $values = array('01:23:45', '00:12:34', '12:34', '2:34'); array_walk($values, function(&$item) { $item = strpos($item, ':') == strrpos($item, ':') ? date("H:i:s", strtotime('00:'.$item)) : date("H:i:s", strtotime($item)); }); print_r($values); array_walk($values, function(&$item) { while (strpos($item, '00:') === 0) $item = substr($item, 3); }); print_r($values); echo "</pre>"; ?> Edited March 10, 2014 by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bioshock Posted March 10, 2014 Report Share Posted March 10, 2014 Creio que funciona como pretendes. $time = '2:34'; list($h, $m, $s) = (strlen($time) != 8 ? explode(':', '00:' . $time) : explode(':', $time)); echo gmdate('H:i:s', ($h * 3600) + ($m * 60) + $s); Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 10, 2014 Report Share Posted March 10, 2014 Creio que funciona como pretendes. $time = '2:34'; list($h, $m, $s) = (strlen($time) != 8 ? explode(':', '00:' . $time) : explode(':', $time)); echo gmdate('H:i:s', ($h * 3600) + ($m * 60) + $s); sim, funciona para todos os formatos apresentados pelo I-NOZex (também conhecido como antigo CTRF agora Unsigned User ...) mas existe um caso particular que não sei se é para ter em conta: $time = '1:23:45' 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bioshock Posted March 10, 2014 Report Share Posted March 10, 2014 Bem, leva mais uma condição lá pó meio..mas se calhar já começa a ficar um pouco confuso..e talvez já não se seja tão good-looking. 😁 list($h, $m, $s) = (strlen($time) != 8 ? (strlen($time) == 7 ? explode(':', '0' . $time) : explode(':', '00:' . $time)) : explode(':', $time)); 1 Report Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 10, 2014 Report Share Posted March 10, 2014 (edited) sabes com comparações com strlen eu poderia andar aqui a fazer notas para valores tipo >> 1:2:3 ... Edited March 10, 2014 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bioshock Posted March 10, 2014 Report Share Posted March 10, 2014 Se esses tipos de input ('1:1:1') forem válidos, então o meu código anula-se. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 10, 2014 Report Share Posted March 10, 2014 (edited) Se esses tipos de input ('1:1:1') forem válidos, então o meu código anula-se. como disse acima ... não sei se é válido ou não ... ps : se é para um 1-liner: echo "<pre>"; $values = array('01:23:45', '1:23:45', '1:2:3', '00:12:34', '12:34', '2:34', '34'); array_walk($values, function(&$item) { $item = date('H:i:s', strtotime(str_repeat('0:', 2 - substr_count($item, ':')).$item)); }); print_r($values); echo "</pre>"; resultado Array ( [0] => 01:23:45 [1] => 01:23:45 [2] => 01:02:03 [3] => 00:12:34 [4] => 00:12:34 [5] => 00:02:34 [6] => 00:00:34 ) Edited March 10, 2014 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bioshock Posted March 10, 2014 Report Share Posted March 10, 2014 Esse tipo de input duvido que seja válido..mas o '1:23:45' vai de encontro ao problema. Link to comment Share on other sites More sharing options...
I-NOZex Posted March 10, 2014 Author Report Share Posted March 10, 2014 (edited) I-NOZex (também conhecido como antigo CTRF agora Unsigned User ...) CLRF amico 😁 peço desculpa pela demora sim, esqueci-me de referir uma entrada do genero 1:23:19 é considerada válida e deve ser convertida para o formato correto já 1:2:3 cria demasiada redundancia de dados, pelo que tenho ideias de nao tornar valida resumindo, o 1º zero da entrada pode ser ignorado: 34 = 34 segundos; 2:10 (2minutos e 10seg); 1:02:34 (1h,2min,34seg) esse teu ultimo codigo é o que recomendas entao happyhippo? e quanto a "anulaçao" dos leading zeros recomendas a segunda parte do codigo da tua primeira resposta? anyway, obrigado a ambos, happy e bioshock pelas vossas opinioes 😄 entretanto precisava de ajuda com outra coisa, agora ja nao é tao php, mas ainda é a questao das formatações como fazer mask a um input field, de modo a puder inserir-se 9.99 ou 99.99 ou 999.99 (é um campo para inserir um tamanho em MB) ou seja, pode ser 1.05 (mb), 11.7, 234.56... tinha grande preferencia que fosse usa solução com base neste plugin http://digitalbush.com/projects/masked-input-plugin/ obrigado desde ja 🙂 Edited March 10, 2014 by I-NOZex B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net Link to comment Share on other sites More sharing options...
bioshock Posted March 10, 2014 Report Share Posted March 10, 2014 É um bocado desnecessário a utilização de um plugin para obteres o que pretendes. Com regex fazes bem isso. ^[0-9]+(\.)?[0-9]{0,2}$ E se precisares de vírgulas ^[0-9]+(\.|,)?[0-9]{0,2}$ Mas pelo que estive a ler, acho que o plugin te permite ter regex. http://stackoverflow.com/questions/17995998/masked-input-plugin-and-regular-expressions-for-decimal-numbers http://stackoverflow.com/questions/4787763/allowing-dash-with-jquery-masked-input-plugin http://stackoverflow.com/questions/9667836/jquerys-maskedinput Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 10, 2014 Report Share Posted March 10, 2014 esse teu ultimo codigo é o que recomendas entao happyhippo? sim, como podes ver o resultado dos testes, passou a tudo ... e quanto a "anulaçao" dos leading zeros recomendas a segunda parte do codigo da tua primeira resposta? sim, é a mais simples tinha grande preferencia que fosse usa solução com base neste plugin http://digitalbush.com/projects/masked-input-plugin/ obrigado desde ja 🙂 só testando ... nunca usei esse plugin IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
I-NOZex Posted March 10, 2014 Author Report Share Posted March 10, 2014 (edited) thanks @happyhippyhippo @bishock a framework (YII) tem um maskedinput baseado nesse plugin, dai a minha preferencia é que eu queria por um lado facilitar a inserção dos dados para o utilizador, e por outro, facilitar a validação o "problema" desse plugin, é que eu penso que ele nao permite ter apenas uma parte opcional, tudo que esteja á direita do ? passa a opcional ou seja, se um meter uma mask ?999.99 vai ser tudo opcional, eu so queria que o 1º caracter fosse opcional... Edited March 10, 2014 by I-NOZex B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net Link to comment Share on other sites More sharing options...
bioshock Posted March 10, 2014 Report Share Posted March 10, 2014 Pá, não conheço o plugin. Só te posso ajudar em termos de regex. O ideal será criares um novo tópico a pedires um regex específico..pelos vistos esse plugin dá para colocar regex. Link to comment Share on other sites More sharing options...
I-NOZex Posted March 10, 2014 Author Report Share Posted March 10, 2014 boas, deixo aqui o topico, como já tas a par do problema penso que dei as infos essenciais, se precisares de mais depois diz https://www.portugal-a-programar.pt/topic/65327-regex-para-criar-mask-input-de-numeros-decimais/ B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now