Halo,
On Sat, Mar 27, 2004 at 02:46:03PM +0700, Jasiph A.P wrote:
> Teman-teman saya lagi konversi program untuk kebutuhan CMS dari PERL
> ke PHP.
> Saya menemui kesulitan untuk memparse secara bersarang, dengan menyelesaikan
> pernyataan yang terdalam terlebih dahulu.
>
> contoh :
> {BIG:{I:{SMALL:tamu}}}
> yang stelah diparse akan menjadi :
> <BIG><I><SMALL>tamu</SMALL></I></BIG>
>
> Di PERL saya menyelesaikan dengan regex sbb:
>
> while ($outbuf =~ s/\{(\w+):([^\}]+?)\}/&$curlies($1,$2)/gse)
Saya nggak tau persisnya fungsi "curlies" anda itu bagaimana. Saya
anggap aja itu fungsi yg recursive, dan contoh program anda ada di
dalam fungsi "curlies" tersebut.
Di PHP, modifier 'e' bisa diganti dengan fungsi: preg_replace_callback.
Jadi contoh kasarnya kira2 begini:
#----------------------------
$str = '{BIG:{I:{SMALL:tamu}}}';
function curlies($m) {
if (is_array($m) && $m[2]) {
$str = '<' . $m[1] . '>' . $m[2] . '</' . $m[1] . '>';
}
else
$str = $m;
// Panggil 'curlies' lagi untuk subset dari string anda
// Jadi setelah recursion pertama, string akan menjadi:
// $str asli = {BIG:{I:{SMALL:tamu}}}
// $str setelah recursion pertama = <BIG>{I:{SMALL:tamu}}</BIG>
// regex anda saya ganti dikit juga, dari [^\}]+? jadi .+ (greedy match).
$str = preg_replace_callback('/\{ (\w+) : (.+)\}/x', 'curlies', $str);
return $str;
}
print curlies($str);
#---------------------------
> Saya agak kebingungan bagaimana melakukannya dengan PHP,
> karena preg_replace bukan mengembalikan kondisi apakah regexnya
> 'match' apa 'tidak' tetapi hasil sesudah subtitusinya.
> Apakah ada cara yang singkat, supaya hal diatas dapat dilakukan
> dengan singkat dan dengan cepat di PHP.
preg_replace dan "s///" di Perl sama2 mengembalikan hasil substitusinya.
Jadi masalah return, perilaku mereka seharusnya sama.
Semoga membantu :-)
Andrew...
>
> Trims berat.
>
>
> --
> Berhenti langganan: [EMAIL PROTECTED]
> Arsip dan info: http://linux.or.id/milis.php
--
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis.php