Salah satu baris dalam skrip saya berisi tag penutup PHP di dalam sebuah string. Dalam operasi normal ini tidak menimbulkan masalah, tetapi saya perlu mengomentari baris.
Saya telah mencoba untuk mengomentari baris ini dengan //
, /*
*/
dan #
tetapi tidak satupun dari mereka bekerja, parser menganggap tag penutup sebagai tag penutup yang sebenarnya.
Inilah baris yang dimaksud:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
Apa yang bisa saya lakukan untuk mengomentari baris di atas?
<?php # echo 'simple';?>
.Jawaban:
Gunakan trik: menyatukan string dari dua bagian. Dengan cara ini, tag penutup dipotong menjadi dua, dan bukan tag penutup yang valid lagi.
'?>' --> '?'.'>'
Dalam kode Anda:
Ini akan membuat
//
komentar berfungsi.Agar
/* */
komentar berfungsi, Anda harus membagi*/
urutannya juga:Ingat, kadang-kadang, meskipun keseluruhan lebih dari jumlah bagian-bagiannya - tetapi menjadi serakah itu buruk, ada kalanya Anda lebih baik dibiarkan kurang . :)
sumber
??<
Cara termudah
Buat variabel terpisah untuk menahan ekspresi reguler Anda; dengan cara ini Anda cukup mengomentari
preg_replace()
pernyataan:Perbaiki menggunakan kelas karakter
Untuk memperbaiki komentar baris, Anda dapat memecahnya
?>
dengan memasukkan ke>
dalam kelas karakter seperti:Untuk memperbaiki komentar blokir, Anda dapat menerapkannya pada
/
:Untuk memperbaiki kedua gaya komentar, Anda dapat menempatkan
/
dan>
di kelas karakter mereka sendiri.Perbaiki menggunakan
/x
pengubahThe
x
pengubah - aliasPCRE_EXTENDED
- abaikan ruang dan baris baru dalam ekspresi reguler (kecuali ketika mereka terjadi di dalam kelas karakter); ini memungkinkan untuk menambahkan spasi untuk memisahkan karakter yang bermasalah. Untuk memperbaiki kedua gaya komentar:sumber
x
pengubah :)g
) ...Mengapa upaya Anda tidak berhasil:
Pekerjaan apa:
Lebih lanjut...
Setelah hal di atas, Anda dapat menggunakan
/*
komentar di luar garis. Jika Anda membiarkannya?>
utuh,//
tidak mungkin mengomentari seluruh baris. Teks berikut?>
bisa berupa html, yang berada di luar kendali penerjemah PHP, sehingga tidak akan berfungsi.Dari dokumentasi:
sumber
Gagasan lain: Kabur dari
>
(dan/
, jika Anda ingin menggunakan/*...*/
komentar):Pelarian "yang tidak perlu" diabaikan oleh mesin regex, tetapi berguna dalam kasus ini (untuk alasan yang diuraikan dalam jawaban lain).
sumber
Mengapa menggunakan "trik" yang rumit, sulit dibaca untuk menyelesaikan masalah?
?
hanyalah pintasan kuantifier untuk kenyamanan, jadiCukup gunakan versi panjang quantifier
{0,1}
, berarti "minimum 0 maksimum 1 kejadian":sumber
Beberapa cara lain yang layak ditambahkan ke buku trik RegEx :
Pertama, Anda bisa memadatkan RegEx Anda ke:
/(<br\s*/?>)+/i
dan ganti dengan<br />
(tidak perlu membebani RegExP dengan lookaheads) dan Anda akan selalu berakhir dengan jeda baris XHMTL yang Anda pilih.Cara lain untuk memodifikasi RegEx Anda sehingga tidak akan tersandung
*/
komentar?>
akhir atau skrip akhir:#(<br\s*+/?+>)+#i
- yang pada dasarnya berarti\s*+
jika Anda menemukan kecocokan spasi sebanyak yang ada dan simpan, dan karena/?+
jika Anda menemukan garis miring, pertahankan!\s*
dan/*
dalam kelompok tangkap =>#(<br(\s*)(/?)>)+#i
Demo langsung: http://codepad.viper-7.com/YjqUbi
Dan karena kita bersandar pada perilaku posesif, RegEx tercepat yang juga mem-bypass masalah komentar adalah: menjelaskan demo
#(<br\s*+/?+>)++#i
Adapun komentar dalam situasi sulit
Ketika Anda tidak dapat mengubah kode, atau sudah menggunakan komentar multiline dan:
1. Gunakan nowdoc :
Kode langsung: http://codepad.viper-7.com/22uOtV
Catatan: nowdoc mirip dengan heredoc tetapi tidak mem-parsing konten dan harus memiliki pembatas awal yang dilampirkan dalam
'
tanda kutip tunggal'
( perhatikan bahwa pembatas akhir tidak dapat diidentifikasi , harus diikuti oleh;
dan baris baru ! )2. Melompati kode dengan goto :
Contoh langsung: http://codepad.viper-7.com/UfqrIQ
3. Melompati kode dengan
if(false)
atauif(0)
:Uji: http://codepad.viper-7.com/wDg5H5
sumber