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
pgpbrs81BBkww.pgp
Description: PGP signature