Saya memiliki kode CSS dan saya ingin menukar kiri dengan kanan dan kanan dengan kiri.

Berikut adalah contoh CSSnya:

.test{text-align:left;margin-left:10px;float:right}
.test_right{text-align:left;border-right:0px;border-left:1px}
.test_left{float:right}

Seharusnya:

.test{text-align:right;margin-right:10px;float:left}
.test_right{text-align:right;border-left:0px;border-right:1px}
.test_left{float:left}

Saya memiliki preg_replace berikut, tetapi hanya cocok dengan 1 instance di setiap {} dan saya membutuhkannya untuk mencocokkan semua instance.

$css = preg_replace('/({.*?)left(.*?})/i', '$1right$2', $css);

Masalah lain dengan ini adalah saya tidak dapat menukar kiri dan kanan karena semuanya akan kanan setelah saya menjalankan preg_replace pertama. Bagaimana saya bisa menyelesaikan masalah itu? Mungkin menggunakan preg_replace_callback?

0
Chris 24 Maret 2020, 10:31

1 menjawab

Jawaban Terbaik

Saya berhasil mengetahuinya.

function callback($match)
{
    $matchit = strtr($match[0], array('left' => 'right', 'right' => 'left'));
    return $matchit;
}

$css= preg_replace_callback('/{(.*?)}/i', 'callback', $css);
echo $css;

Preg_replace_callback mengembalikan apa pun antara { dan }. Fungsi panggilan balik menggantikan kiri dan kanan.

Saya lebih menyempurnakan fungsi ini untuk menambahkan semacam pemicu abaikan sehingga PHP akan mengabaikan kelas/ID tertentu. Juga, itu perlu melakukan beberapa pembalikan pada padding dan margin, antara lain. Semuanya akan dibuat menjadi kelas bagi siapa saja yang menggunakan PHP untuk mengonversi CSS ke RTL dengan mudah.

Pembaruan:

Anda dapat menggunakan preg_replace ini sebagai gantinya:

$css = preg_replace_callback('/{(?!\/\*i\*\/)(.*?)}/i', 'callback', $css);

Kemudian Anda dapat meletakkan /*i*/ ke dalam baris mana pun yang Anda ingin abaikan. Sebagai contoh:

.test{/*i*/margin-left:0px;text-align:right}
0
Chris 24 Maret 2020, 22:07