How can I take off a letter from a string in PHP? - php

I would like to know how can I take a character out of a string?
I have a date:
$date = "04.08.2013";
I would like to take just the first 2 zeros off. Like that:
$date = "4.8.2013"
How can I do it?

A simplish (read: hacky) solution would be:
$date = implode('.', array_map(function($x) { return (int)$x; }, explode('.', $date)));

You can may also get it done quickly using a regex:
$new_date = preg_replace('/(?<=^|\.)0/', '', $date);
Or more simply without the lookbehind (thanks #IlmariKaronen):
$new_date = preg_replace('/\b0/', '', $date);
Demo

use explode() to separate the string into an array then use ltrim to delete "0"
i.e.
$date = explode(".", "04.08.2013");
$new_date = implode(".", array(ltrim($date[0],"0"), ltrim($date[1],"0"), $date[2]));
or something like that

Related

How to pull the non delimited date and time out of a string

I need to pull the date and time out of this string: some_report_20161005_1530.xml so I can reformat it to something more work-with-able. The date and time will change from file to file, but will always stay in this format: some_report_{year}{month}{day}_{24hr time}.xml
$test = 'some_report_20161005_1530.xml';
preg_match('(\d{4})(\d{2})(\d{2})_(\d{4})', $test, $test_matches);
print_r( $test_matches );
What would be the best way to accomplish this?
(Forgive my ignorance or misuse of these functions. I am by no means an expert)
If the some_report doesn't contain digits, the date and time parts are already in a good order to work in the DateTime constructor, so you can extract them with a simpler regex.
$date_time = new DateTime(preg_replace("/[^0-9]/", "", $your_string));
One simple regex approach would be to pull out the 8 and 4 digit numbers:
preg_match("/(\d{8})_(\d{4})/", $filename, $matches);
array_shift($matches);
list($date, $time) = $matches;
Working example: https://3v4l.org/npGC8
Or you could just use explode and skip the regex:
list($name1, $name2, $date, $time) = explode("_", str_replace(".","_", $filename));
Working example: https://3v4l.org/lAvTN
Then it's as simple as handing it to DateTime, such that you can manipulate or format however you want.
$dt = new DateTime($date . $time);
echo $dt->format('n/j/y h:ia'); // 10/5/16 03:30pm
$test = 'some_report_20161005_1530.xml';
echo preg_replace('#(\d{4})(\d{2})(\d{2})(_)(\d{2})(\d{2})#',
'${1}-${2}-${3}_${5}:${6}', $test) , '<br/>';
preg_match(
'#(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})(_)(?<hour>\d{2})(?<minute>\d{2})#',
$test,$test_matches);
print_r( $test_matches );
Just examples...

PHP - Converting Hours to Mintues

I use this site alot and finally I have come across something that I can seem to figure out. I have a time returned of:
"1hr 59min"
What I would like it to do is covert this value to Minutes (119).
I havew tried various strtotime methods but none seem to do the trick. Any ideas?
cheers,
Stu
If it is a string you could do
$onefiftynine = "1hr 59min";
$split = explode(' ',$onefiftynine);
$hour = substr($split[0],0,strpos($split[0],'hr'));
$min = substr($split[1],0,strpos($split[1],'min'));
echo $hour * 60 + $min;
Read php docs and use right function, for example http://www.php.net/manual/en/datetime.createfromformat.php , etc.
If you use REGEX, then using preg_replace():
$str = '1hr 59min';
$str = preg_replace("/(\d+)hr (\d+)min/e", "$1*60+$2", $str);
// parsing the hour and minute, and doing calculation
If your input can have only hr or only min, then add the following two lines with above:
$str = preg_replace("/(\d+)hr/e", "$1*60", $str);
$str = preg_replace("/(\d+)min/", "$1", $str);
I guess you could use a regex :
function convertToSeconds($time)
{
$matches = array();
if (preg_match('/^(\d+)hr (\d+)min$/', $time, $matches) {
return $matches[1]*60 + $matches[2];
}
}

PHP add colons to a string

Hello I have this string that will generate the time that I then insert in the db
$time=mktime(date('G'),date('i'),date('s'));
$NowisTime=date('Gis',$time);
Now I need to readd colons to this string: :
I need it to be generated and inserted without colons, but shown in another place with colons reinserted, so that it will look like this:
13:24:09
Instead of:
132409
The same is for $todaydate = date('Ymd');
That should become then 2011-06-16
How can I do that?
Counting the words is not good, since we can have more or less types depending by the actual time and date.
Please advise
Thank you!
FOR WHO DOES NOT UNDERSTAND: this values are taken from the DB so I cannot use : date('Y-m-d'); in a values taken from the db........
The same is for $todaydate =
date('Ymd');
That should become then 2011-06-16
For this one, try :
date('Y-m-d');
Similar for your Other part.
Edit ::
For Date :
$time = "time from database";
$unixtimestamp = strtotime ( $time) ;
$date = date('Y-m-d', $unixtimestamp);
For time :
$time = strtotime("time from database");
$yourtime = date("H:i:s", $time);
The strings you supply for formatting can contain anything you'd like, so putting the dashes or semicolons there is no problem. You can even include other text, as long as any letters used in the date code are escaped with a backslash.
The entire
$time=mktime(date('G'),date('i'),date('s'));
$NowisTime=date('Gis',$time);
could be rewritten, too. You're maing a timestamp from the current time, then giving it to date(). date uses the current time by default, so there's no need to do that to show the current time.
Here's one way:
$NowisTime=date('G:i:s');
If you are doing exactly what you say you are doing, you can count the characters starting at the end and add the characters (: and -) at the right place:
Both date('is') and date('Ymd') produce a fixed format using leading zeros so the length is always the same. You only have to compensate for the date('G') part.
So really all you have to do is chop off 2 characters from the end of the string twice and what remains is the year or the hour.
Well if you use date('his') instead and cast it as a string (so PHP doesn't interpret it as an integer and remove the possible leading zero), you can add colons by splitting the string every two numbers and then imploding it with colons.
$d = (string)date( 'his' );
echo (int)$d; //Format without colons
echo implode( ':', array_map('intval', str_split( $d, 2 ) ) );
For the second part, do the same except split the string by 4 characters and then split the second split by 2.
$d = date('Ymd');
echo $d; //Format without dashes
list($year, $second) = str_split( $d, 4 );
$parts = str_split( $second );
array_unshift( $parts, $year );
echo implode( '-', $parts );
In both situations however it would just be easier to start out with the formatted strings (with the colons and dashes) and remove them for the db.
$d = date('G:i:s');
echo $d; //With colons
echo str_replace( ':', '', $d );
$d = date('Y-m-d');
echo $d; //With dashes
echo str_replace( '-', '', $d );
When you are generating the value to store in your database, use a Unix timestamp:
$timestamp = time();
// store $timestamp in your database
That way you don't have to worry about how it looks or parsing it at all. Then, when you're ready to display it to your user, you can use:
$formattedTime = date('G:i:s', $timestamp);
which will display it in the colonated (is that even a word?) format for your users.
Couldn't you do something like :
$new = "";
for ($i = 2; $i <= strlen($NowisTime); $i+2) {
$new .= $NowisTime[$i-2] . $NowisTime[$i-1] . ":";
}
$NowisTime=date('G:i:s',$time);
$todaydate = date('Y-m-d');

PHP count, add colons every 2 characters

I have this string
1010081-COP-8-27-20110616214459
I need to count the last 6 characters starting from the end of this string (because it could may be long starting from the begin)
Then I need to add colons after every 2 characters.
So after counting 6 characters from the end it will be
214459
After having added the colons it will look like:
21:44:59
Can you help me achieving it?
I do not really know where to start!
Thank you
You can do this with substr, str_split and implode
The code is done on multiple lines for clarity, but can easily be done in a chain on one line:
$str = '1010081-COP-8-27-20110616214459';
//Get last 6 chars
$end = substr($str, -6);
//Split string into an array. Each element is 2 chars
$chunks = str_split($end, 2);
//Convert array to string. Each element separated by the given separator.
$result = implode(':', $chunks);
echo preg_replace('/^.*(\d{2})(\d{2})(\d{2})$/', '$1:$2:$3', $string);
It looks to me though like that string has a particular format which you should parse into data. Something like:
sscanf($string, '%u-%3s-%u-%u-%u', $id, $type, $num, $foo, $timestamp);
$timestamp = strtotime($timestamp);
echo date('Y-m-d H:i:s', $timestamp);
If you just want the time:
$time = rtrim(chunk_split(substr($s,-6),2,':'),':');
$final = "1010081-COP-8-27-20110616214459";
$c = substr($final, -2);
$b = substr($final, -4, 2);
$a = substr($final, -6, 2);
echo "$a:$b:$c";

Help on parsing formatted string

I have strings:
17s 283ms
48s 968ms
The string values are never the same and I want to extract the "second" value from it. In this case, the 17 and the 48.
I'm not very good with regex, so the workaround I did was this:
$str = "17s 283ms";
$split_str = explode(' ', $str);
foreach($split_str as $val){
if(strpos($val, 's') !== false) $sec = intval($val);
}
The problem is, the character 's' exists in both split_str[0] and split_str[1], so my $sec variable keeps obtaining 283, instead of 17.
Again, I'm not very good with regex, and I'm pretty sure regex is the way to go in this case. Please assist. Thanks.
You don't even need to use regex for this.
$seconds = substr($str, 0, strspn($str, '1234567890'));
The above solution will extract all the digits from the beginning of the string. Doesn't matter if the first non-digit character is "s", a space, or anything else.
But why bother?
You can even just cast $str to an int:
$seconds = (int)$str; // equivalent: intval($str)
See it in action.
Regular expressions are definite overkill for such a simple task. Don't use dynamite to drill holes in the wall.
You could do this like so:
preg_match('/(?<seconds>\d+)s\s*(?<milliseconds>\d+)ms/', $var, $matches);
print_r($matches);
If the string will always be formatted in this manner, you could simply use:
<?php
$timeString = '17s 283ms';
$seconds = substr($timeString, 0, strpos($timeString, 's'));
?>
Well, i guess that you can assume seconds always comes before milliseconds. No need for regexp if the format is consistent. This should do it:
$parts = explode(' ', $str);
$seconds = rtrim($parts[0], 's')
echo $seconds; // 17s
This will split the string by space and take the first part 17s. rtrim is then used to remove 's' and you're left with 17.
(\d+s) \d+ms
is the right regexp. Usage would be something like this:
$str = "17s 283ms";
$groups = array();
preg_match("/(\d+)s \d+ms/", $str, $groups);
Then, your number before ms would be $groups[1].

Categories