webForumDet fria alternativet

RegExp som lägger till nollor?

PHPur PHP

7 svar · 1 505 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hallå!

Jag har tidskoder som jag skulle vilja formatera med inledande nollor om man inte har angivit det. Här är några exempel på hur jag vill att man ska kunna mata in och hur det ska rättas till:

1:2 blir 01:02
1:2:3 blir 01:02:03
1:2:3:4 blir 01:02:03:04 (max är tre kolon)

Fler exempel:
1:20 blir 01:20
01:2:30 blir 01:02:30
10:20:03:4 blir 10:20:03:04

Min start innan jag gav upp hehe:

function format_timecode($tc)
{
	if( preg_match("/:/", $tc) ) {
		//strpos($tc, ':')
	}

	return $tc;
}

Tack!

Medlem sedan juni 20019 519 inlägg
#2
function format_timecode($tc)
{
	$timeFormat = preg_split("/:/", $tc);
	$response = "";

	foreach($timeFormat as $t){
		$response.= substr("0" . $t, -2) . ":";
	}

	return substr($response, 0, -1);
}

finns förhoppningsvis bättre sätt att skriva det på.

regex letar efter mönster, vill du att man skall validera invärdet innan den kör koden?:

function format_timecode($tc)
{
	if(preg_match('/^\d{1,2}((:\d{1,2}){1,3})$/', $tc)){
		$timeFormat = preg_split("/:/", $tc);
		$response = "";

		foreach($timeFormat as $t){
			$response.= substr("0" . $t, -2) . ":";
		}

		return substr($response, 0, -1);
	}
	return null;
}
Medlem sedan aug. 20039 342 inlägg
#3
function format_timecode($tc)
{
        return preg_replace('/(:|^)(\\d)(?=:|$)/', '${1}0$2', $tc);
}

Den koden letar efter valfritt antal segment och lägger till en nolla vid behov. Ett segment består av början av strängen eller ett kolon, följt av exakt en nuffra, följt av slutet av strängen eller kolon. ?= "spolar tillbaka" matchningen så att två fält som behöver fixas som kommer efter varandra inte krånglar, typ 1:2:3:4 eftersom uttrycket annars hade ätit nästa fälts inledande kolon.

Uttrycket gör ingen validering i övrigt utan arbetar matchar bara enskilda fält, så en sträng med tusen fält eller något i stil med 1:bajs:3:4 kommer också fixas.

Medlem sedan nov. 20016 480 inlägg
#4

nitro2k01 skrev:

function format_timecode($tc)
{
        return preg_replace('/(:|^)(\\d)(?=:|$)/', '${1}0$2', $tc);
}

Den koden letar efter valfritt antal segment och lägger till en nolla vid behov. Ett segment består av början av strängen eller ett kolon, följt av exakt en nuffra, följt av slutet av strängen eller kolon. ?= "spolar tillbaka" matchningen så att två fält som behöver fixas som kommer efter varandra inte krånglar, typ 1:2:3:4 eftersom uttrycket annars hade ätit nästa fälts inledande kolon.

Uttrycket gör ingen validering i övrigt utan arbetar matchar bara enskilda fält, så en sträng med tusen fält eller något i stil med 1:bajs:3:4 kommer också fixas.

Fett, funkade utmärkt. Tack båda!

Kan preg_replace('/(:|^)(\\d)(?=:|$)/', '${1}0$2', $tc); översättas till javascript också? Jag testade detta, men verkar inte funka:

tc.replace('/(:|^)(\\d)(?=:|$)/', '${1}0$2');
Medlem sedan juni 20019 519 inlägg
#5
ts.replace(/(:|^)(\d)(?=:|$)/g, "$10$2");
Medlem sedan nov. 20016 480 inlägg
#6

Asbra! Tack igen guys :)

Medlem sedan nov. 20016 480 inlägg
#7

Kan jag köra samma replace, men lägga till så att punkter ersättas med kolon?

preg_replace('/(:|^)(\\d)(?=:|$)/', '${1}0$2', $tc);

Tack för tips!

Edit/ Eller så kör jag bara en sån replace före den här.

Medlem sedan juni 20019 519 inlägg
#8

replace fungera väl

129 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)