Solved

Add char to each string element

Posted on 2010-11-26
15
264 Views
Last Modified: 2012-05-10
Hi,

I have this:
$Str='test(4)-test(51)-test(9)-test(12)-test(33)-test(4)';
$something_here='';
foreach(explode('-',$Str) as $xx) {
            	$string1=(preg_replace("/\([0-9]\)/", $something_here, $xx));
}
echo $string1;

Open in new window

So as you can see I need to replace elements inside brackets if there's just one digit, more specifically, I want to add '0' (zero) before this digit. I just need $something_here var, but can't manage with that, please help. Or you can think about different way to do that.
I want this output:
test(04)-test(51)-test(09)-test(12)-test(33)-test(04)

Open in new window


Thanks.
0
Comment
Question by:Zado
  • 7
  • 4
  • 2
  • +1
15 Comments
 
LVL 1

Expert Comment

by:pak_slm
ID: 34216739
Is there Number if test() is fixed, mean  in you string test() present 6 time?
0
 
LVL 8

Author Comment

by:Zado
ID: 34216772
No, it could be any word or number there
0
 
LVL 1

Expert Comment

by:pak_slm
ID: 34216815
i mean count is fixed to 6 or vary.
0
 
LVL 13

Assisted Solution

by:darren-w-
darren-w- earned 250 total points
ID: 34216852
how about this:

replace this line to :

$string1=(preg_replace_callback("/\([0-9]\)/","addzero", $xx));

add this function:

function addzero($matches)
{
if (strlen($matches)<2){
$matches= "0".$matches;
}
return $matches;
}
0
 
LVL 8

Author Comment

by:Zado
ID: 34216856
vary, it could be:
asdf(4)-0000000(51)-test1(09)-test2(12)-tesssst(33)-test(4)-12345(1)

Open in new window

but always hyphen separated and one or two digits in brackets
0
 
LVL 8

Author Comment

by:Zado
ID: 34216971
Thanks darren-w-, I changed a bit your script and almost works, it adds zero before one digit, but changes this digit into 'Array' in output, that's the only problem.

function addzero($matches)
{
if (strlen($matches)<6){
$matches= "0".$matches;
}
return '('.$matches.')';
}

foreach(explode('-',$Str) as $xx) {
				$string1=(preg_replace_callback("/\([0-9]\)/", "addzero", $Str));
}
echo $string1;

Open in new window

It changes this:
test(4)-test(51)-test(9)-test(12)-test(33)-test(4)

Open in new window

into this:
test(0Array)-test(51)-test(0Array)-test(12)-test(33)-test(0Array)

Open in new window

but should be this:
test(04)-test(51)-test(09)-test(12)-test(33)-test(04)

Open in new window

0
 
LVL 8

Author Comment

by:Zado
ID: 34217022
Ok, solution is closer here:

function addzero($matches)
{
if (strlen($matches)<6){
$matches= "0".$matches[0];
}
return $matches;
}

foreach(explode('-',$Str) as $xx) {
				$string1=(preg_replace_callback("/\([0-9]\)/", "addzero", $Str));
}
echo $string1;

Open in new window


Just need to move opening bracket before zero, it gives this output:
      

test0(4)-test(51)-test0(9)-test(12)-test(33)-test0(4)

Open in new window

0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 1

Assisted Solution

by:n4r-c0m
n4r-c0m earned 250 total points
ID: 34217053
    function addzero($m) {
        $m = $m[1];
        if (strlen($m)<2) {
            $m= "(0".$m.")";
        }
        return $m;
    }

    $Str='test(4)-test(51)-test(9)-test(12)-test(33)-test(4)';
    $something_here='';
    foreach(explode('-',$Str) as $xx) {
                    $string1=(preg_replace_callback("/\(([0-9])\)/","addzero", $xx));
                    echo $string1;
    }

Open in new window

0
 
LVL 13

Expert Comment

by:darren-w-
ID: 34217059
$Str='test(4)-test(51)-test(9)-test(12)-test(33)-test(4)';
$patterns=array();
$patterns[0] = "/\({1}[0-9]\)/";
$patternsr=array();
$patternsr[0] = "(0\${1}1)";
print preg_replace($patterns,$patternsr,$Str);

returns

test(01)-test(51)-test(01)-test(12)-test(33)-test(01)
0
 
LVL 13

Expert Comment

by:darren-w-
ID: 34217069
oops thats wrong
0
 
LVL 8

Accepted Solution

by:
Zado earned 0 total points
ID: 34217148
OK, done:

My solution (darren's script changed actually):
function addzero($matches) {
	if (strlen($matches)<6) {
		$matches= "0".$matches[0];
    	foreach(explode('(',$matches) as $yy) {
       		$matches=(preg_replace("/\(/", "", $matches));
        }
  	}
  	return '('.$matches;
}

foreach(explode('-',$Str) as $xx) {
	$string1=(preg_replace_callback("/\([0-9]\)/", "addzero", $Str));
}
echo $string1;

Open in new window


@n4r-c0m solution (corrected):
$string1=(preg_replace_callback("/\(([0-9])\)/","addzero2", $xx)); changed to
$string1=(preg_replace_callback("/\(([0-9])\)/","addzero2", $Str)); that's my fault, I gave it in question.
Plus move echo out from foreach loop.
function addzero2($m) {
        $m = $m[1];
        if (strlen($m)<2) {
            $m= "(0".$m.")";
        }
        return $m;
    }

    foreach(explode('-',$Str) as $xx) {
                    $string1=(preg_replace_callback("/\(([0-9])\)/","addzero2", $Str));
    }
	echo $string1;

Open in new window


Thanks a lot for your help.
0
 
LVL 13

Expert Comment

by:darren-w-
ID: 34217489
Simplified this a little:

<?php
$Str='test(4)-test(51444)-test(9)-test(122)-test(33)-test(1)';
$patterns=array("/\(([0-9])\)/");
$patternsr=array("(0$1)");
print preg_replace($patterns,$patternsr,$Str);
?>

returns: test(04)-test(51444)-test(09)-test(122)-test(33)-test(01)

without callback
0
 
LVL 1

Expert Comment

by:n4r-c0m
ID: 34217584
Great solution!
More simplify :) :

$Str='test(4)-test(51444)-test(9)-test(122)-test(33)-test(1)';
print preg_replace("/\(([0-9])\)/","(0$1)",$Str);

Open in new window

0
 
LVL 8

Author Comment

by:Zado
ID: 34237547
Thanks for help :-)
0
 
LVL 8

Author Closing Comment

by:Zado
ID: 34246245
I found proper solution based on experts comments, I just changed a bit their scripts, but my comment presents actual solution.
Thanks.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Deprecated and Headed for the Dustbin By now, you have probably heard that some PHP features, while convenient, can also cause PHP security problems.  This article discusses one of those, called register_globals.  It is a thing you do not want.  …
This article discusses how to create an extensible mechanism for linked drop downs.
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

932 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now