On Tue, May 03, 2005 at 07:11:05PM +0700, Firman Pribadi wrote:
> hai semua,
> 
> saya bermaksud mengganti tanggal dalam format d-m-Y dengan date, dan mktime.
> variabel tgl, bulan, dan tahun diperoleh dari hasil preg_replace berikut:
> 
> $risi = "<td>1 Mei 2005  13:51:08 UTC</td>";
> $risi = preg_replace ("/<td>([0-9]{1,2})\ ([0-9]{1,2})\ ([0-9]{4})\ \
> ([0-9:]{5,8})\ UTC<\/td>/", "<date>" . date ("d-m-Y", mktime
> (0,0,0,\\2,\\1,\\3)) . "</date>\n<time>\\4</time>", $risi);
> 
> tapi backreference dari preg_replace untuk \\n atau \${n} tidak pernah
> berhasil dimasukkan ke mktime. saya sudah mencoba tanpa tanda petik,
> dengan petik satu, dan petik dua, tapi masih belum ada hasil.
> 
> ada yang bisa bantu? atau memang disebabkan mktime hanya menerima
> nilai dalam bentuk digit?.

Ini basic troubleshooting dari masalah apa pun: break it down into
manageable components, jangan sekaligus menyelesaikan semuanya.

Itu udah yakin patternnya match? Kalo gak match kan gak akan
direplace. Test dulu pake preg_match().

$risi = "<td>1 Mei 2005  13:51:08 UTC</td>";
if (preg_match("/<td>([0-9]{1,2})\ ([0-9]{1,2})\ ([0-9]{4})\ \ ([0-9:]{5,8})\ 
UTC<\/td>/", $risi, $matches))
{
  echo "match, matches:";
  print_r $matches;
}
else
  echo "no match";


Di inputnya ($risis) bulannya pake "Mei" tapi di patternnya pake
digits, mana pernah match kalo gitu. Dan space tidak perlu diescape
pake backslash.

Kalo saya ngematchnya akan pake pattern ini (groupingnya tetep): 
/^<td>(\d\d?)\s+([A-Za-z]+)\s+(\d{4})\s+(\d\d:\d\d:\d\d)\s+UTC<\/td>$/

Untuk backrefnya menurut manualnya (http://php.net/preg_replace)
katanya format $n lebih diprefer daripada \\n.

Lalu selain itu juga backref hanya akan bekerja di dalam konteksnya
preg_replace dong, kalo anda panggil 'f1(f2(input))' maka input akan
diinterpret oleh f2() *duluan* dan f1() cuma terima hasil bersihnya
aja dr f2(), jadi 'f1(f2(input))' itu sama dengan 'tmp=f2(input);
f1(tmp)'. Ganti "f1" dengan "preg_replace" dan ganti "f2" dengan
"date". Jadi date akan diexecute dulu sebelum preg_replace.

Lagipula, kenapa repot2 pake mktime()? Bukannya bisa gini:

$pattern = 
"/^<td>(\d\d?)\s+([A-Za-z]+)\s+(\d{4})\s+(\d\d:\d\d:\d\d)\s+UTC<\/td>$/";
$risi = preg_replace($pattern, "<date>$1-$2-$3</date>\n<time>$4</time>", $risi);

Yg jadi masalah skrg itu, $2 itu inputnya dalam text, bukan numeric.
Itu emang inputnya begitu atau anda salah ketik atau gimana. Kalo text
sudah jelas gak bisa dipake utk jadi inputnya mktime lah. Lihat
http://au2.php.net/mktime kan semuanya int.

Sekarang mundur sejenak dan lihat big picture dr masalahnya. Apakah
$risi itu memang sudah input "dari sononya", atau sesuatu yg anda
generate sendiri? Sebetulnya apa yg ingin anda capai dg cara di atas?
Lg bikin apaan kalo boleh tau?

Ronny

Attachment: pgpbrs81BBkww.pgp
Description: PGP signature

Kirim email ke