|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-07-19 19:54 UTC] joeasdf at hotmail dot com
I want to reformat a date string from mm/yy to yymmdd (e.g. replace "67/89" with "896701". The problem is that I need to be able to separate my numbered backreferences but NOT separate the output text. In perl, this would be written as "${2}${1}01", but PHP does not allow curly braces in the numbered reference.
$text = '67/89';
$patt = '!(\d\d)/(\d\d)(?=\t)!';
$repl = '{$2}${1}01';
echo preg_replace($patt, $repl, $text);
// outputs "{89}${1}01"
The PHP manual for preg_replace says that numbered backreferences work for numbers from 0 - 99, so I figured I'd try two-digit backreference numbers to force the separation between $1 and 01:
$repl = '$02$0101';
Here's where the real bug lies -- $02 is substituted properly, but the 2 and 1 are still inserted into the output! Only '$0' is removed from the replacement pattern:
echo preg_replace($patt, $repl, $text);
// outputs "89267101"
The third character, 2, is the 2nd digit of $02. Similarly, the 1 immediately following 67 is from $01.
The only way to get around this problem is to use preg_match() and manually create the string using the $matches array.
if(preg_match('(.*)' . $patt . '(.*)', $text, $matches))
{
$text = $matches[1]; // everything before $patt
$text .= $matches[3]; // our old $2
$text .= $matches[2]; // our old $1
$text .= '01'; // from the original replacement
$text .= $matches[4]; // everything after $patt
}
Seems a huge waste...
Take care,
nik
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 02:00:01 2025 UTC |
I added the ability to use Perl-style ${n} references. This should take care of your problem.