Penggantian Php pembolehubah ke dalam rentetan. Str_replace - Menggantikan semua kejadian rentetan carian dengan rentetan gantian. Penerangan rentetan dalam PHP

Baru-baru ini, perbincangan tentang bahasa PHP pada Habré lebih kepada keupayaan untuk mereka bentuk sistem yang kompleks, yang merupakan berita baik. Walau bagaimanapun, selepas melihat sedozen rangka kerja web yang paling diiktiraf (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ dan lain-lain), saya amat terkejut apabila mendapati kelemahan ketara dalam beberapa dari sudut pengoptimuman asas. .

Untuk menjadikan topik ini lebih berorientasikan teknikal, hasilnya dibentangkan dalam bentuk yang lebih ketat, yang mungkin merumitkan persepsi.

Jadi, mari... Tugasnya amat mudah: menjalankan eksperimen tentang kelajuan membentuk rentetan daripada subrentetan dalam petikan tunggal dan berganda. Pada dasarnya, soalan ini akan menjadi relevan untuk masa yang lama kerana keanehan pemprosesan rentetan dalam PHP.

Terdapat banyak artikel mengenai pengoptimuman asas skrip, dalam bahasa Rusia dan dalam bahasa lain. Ia mengatakan sedikit tentang rentetan, tetapi mencatat fakta bahawa rentetan dalam petikan berganda "dihuraikan" untuk pembolehubah dan aksara kawalan (sama seperti dalam dokumentasi rasmi). Berdasarkan ini, adalah logik untuk mengandaikan bahawa menggunakan rentetan dalam petikan berganda akan menjadi agak perlahan dalam operasi daripada operasi yang sama dengan subrentetan dalam petikan tunggal.

Selain menggantikan pembolehubah ke dalam rentetan dan menggabungkan pembolehubah dengan subrentetan, PHP melaksanakan sekurang-kurangnya satu lagi cara untuk menjana rentetan: bekerja dengan fungsi sprintf. Adalah logik untuk mengandaikan bahawa kaedah ini akan jauh lebih rendah daripada kaedah "standard" disebabkan oleh panggilan fungsi yang tidak diperlukan dan penghuraian rentetan di dalamnya.

Satu-satunya tambahan, sebelum saya membentangkan anda kod skrip ujian: adalah perlu untuk mempertimbangkan 2 pilihan yang mungkin untuk bekerja dengan rentetan dalam petikan berganda: dengan mengambil kira gaya pengekodan yang mudah dan "maju". Anda mungkin tidak perlu memberi perhatian kepada fakta bahawa pembolehubah berada di awal baris - ia hanyalah contoh:
$string = "$_SERVER["HTTP_HOST"] bukan pentadbiran wilayah Ulyanovsk. Kami suka bahasa Rusia dan tidak suka mereka yang bercakap itu..."
Dan
$string = "($_SERVER["HTTP_HOST"]) bukan pentadbiran wilayah Ulyanovsk. Kami suka bahasa Rusia dan tidak suka mereka yang bercakap..."

Ujian nombor satu.
Nah, nampaknya semua tempahan telah dibuat - sudah tiba masanya untuk menunjukkan hasil kerja. Kod sumber untuk penguji boleh didapati.

Tangkapan skrin menunjukkan bahawa hipotesis saya tidak disahkan. Satu-satunya andaian yang betul ternyata adalah tentang bekerja dengan rentetan melalui sprintf. Yang terpantas ialah fungsi yang berfungsi secara khusus dengan petikan berganda.

Selepas memikirkan secara ringkas tentang situasi itu, penjelasan itu datang secara semula jadi: intinya ialah rentetan rujukan yang mana penggantian dibuat adalah terlalu pendek: laluan penghurai melalui rentetan sedemikian adalah sekeping kek. Walau bagaimanapun, walaupun di sini adalah jelas bahawa penggantian asli pembolehubah ke dalam rentetan memberikan kelebihan berbanding "gaya lanjutan".
Ini juga merupakan kelemahan pendekatan penggabungan: volum data yang dimasukkan melebihi volum subrentetan. Anda boleh membaca dari mana kos overhed datang dalam habratopik yang telah disebutkan.

Walau bagaimanapun, walaupun pemikiran ini perlu disahkan. Ini memerlukan ujian kedua dengan perubahan kepada kemungkinan sebab yang disebutkan untuk tingkah laku yang tidak dapat diramalkan (bagi saya). Nampaknya, banyak yang telah diubah suai dalam versi kelima (saya akui, dalam versi kelima PHP saya hanya menjalankan 1 ujian: untuk merentasi elemen tatasusunan).

Ujian nombor dua.
Hipotesis kedua: memanjangkan rentetan rujukan akhirnya akan mengakibatkan peningkatan dalam peratusan masa operasi fungsi ujian yang berkaitan dengan pembentukan rentetan dalam petikan berganda, berbanding dengan keputusan ujian nombor 1. Situasi yang sama, secara teori, harus diperhatikan berhubung dengan pengendalian fungsi sprintf. Ini disebabkan, pertama sekali, keperluan untuk menghuraikan rentetan dan peningkatan masa yang dihabiskan untuk ini. Dalam situasi dengan penggabungan subrentetan dalam petikan tunggal, saya fikir keputusan yang lebih kurang sama akan diperhatikan seperti dalam ujian pertama, yang akan memberikan sedikit penurunan dalam bahagian masa pelaksanaan fungsi petikan_3() berbanding dengan masa pelaksanaan daripada keseluruhan skrip (tetapi bukan keuntungan prestasi).

Kesimpulan sebenarnya hanya positif dan mengesahkan hipotesis. Dengan sedikit peningkatan dalam rentetan rujukan, beban besar muncul, yang membawa kepada penurunan dalam prestasi fungsi untuk bekerja dengan petikan berganda dan sprintf.

Andaian mengenai rentetan dalam petikan tunggal juga ternyata betul: bukannya 36.75% masa dalam ujian pertama, dalam kedua fungsi quotes_3() mengambil 33.76% daripada masa pelaksanaan skrip

Nilai praktikal.
Secara ringkas, mengabstraksikan daripada data, kita boleh membuat kesimpulan: semakin panjang rentetan di mana penggantian perlu dibuat, semakin besar kemungkinan operasi penggabungan akan dilakukan lebih cepat daripada mencari pembolehubah dalam petikan berganda. Sukarelawan boleh cuba memilih parameter sisipan yang diperlukan (bilangan pembolehubah, panjang rentetan rujukan, panjang rentetan dalam pembolehubah) supaya mereka memenuhi kesamaan masa pelaksanaan.

Itu sahaja, sebenarnya. Ia hanya tinggal untuk menambah bahawa tidak ada perkara kecil dalam pengaturcaraan (maksud saya kepada mereka yang suka mengatakan "menjimatkan pada perlawanan" (c) Adelf). Mengetahui kehalusan sedemikian dan mengambil kiranya, anda boleh menulis kod yang akan dioptimumkan pada semua peringkatnya;)

PS:
Ujian dilakukan menggunakan Zend Studio For Eclipse 6.0.0 (Debugger + Profiler disertakan).
PHP versi 5.2.5
OS Linux Debian

PPS:
Saya akan gembira jika seseorang menyiarkan keputusan ujian ini. Saya fikir ini akan membolehkan penilaian yang lebih objektif tentang keperluan untuk menggunakan satu atau satu lagi kaedah penggantian ke dalam rentetan. Saya juga akan menghargai kritikan yang sihat terhadap gaya dan reka bentuk persembahan.

(PHP 4, PHP 5, PHP 7)

str_replace — Menggantikan semua kejadian rentetan carian dengan rentetan gantian

Penerangan

Fungsi ini mengembalikan rentetan atau tatasusunan dengan semua kejadian carian dalam subjek digantikan dengan replace .

Jika anda tidak memerlukan peraturan carian/ganti yang kompleks (seperti ungkapan biasa), menggunakan fungsi ini adalah lebih baik daripada preg_replace() .

Senarai parameter

Jika carian dan ganti ialah tatasusunan, maka str_replace() menggunakan setiap nilai dalam tatasusunan yang sepadan untuk mencari dan menggantikan subjek . Jika tatasusunan ganti mempunyai kurang elemen daripada carian , rentetan kosong akan digunakan sebagai rentetan gantian untuk nilai yang tinggal. Jika carian ialah tatasusunan dan ganti ialah rentetan, maka rentetan gantian itu akan digunakan untuk setiap elemen tatasusunan carian. Kes terbalik tidak masuk akal.

Jika carian atau ganti ialah tatasusunan, elemen mereka akan diproses dari pertama hingga terakhir.

Nilai carian, juga dikenali sebagai jarum(jarum). Anda boleh menggunakan tatasusunan untuk berbilang nilai carian.

Gantikan

Nilai gantian akan digunakan untuk menggantikan nilai carian. Anda boleh menggunakan tatasusunan untuk berbilang nilai.

Subjek

Rentetan atau tatasusunan yang mencari dan menggantikan dilakukan, juga dikenali sebagai tumpukan jerami(timbunan jerami).

Jika subjek ialah tatasusunan, maka carian dan ganti akan dilakukan pada setiap elemen subjek, dan hasil fungsi itu juga akan menjadi tatasusunan.

Jika lulus, ia akan ditetapkan kepada bilangan penggantian yang dibuat.

Kembalikan nilai

Fungsi ini mengembalikan rentetan atau tatasusunan dengan nilai yang diganti.

Contoh

Contoh #1 Contoh penggunaan str_replace()

Contoh #2 Contoh helah yang berpotensi dengan str_replace()

Nota

Nota: Fungsi ini selamat binari.

Amaran

Nota mengenai prosedur penggantian

Oleh kerana str_replace() menggantikan dari kiri ke kanan, apabila menggunakan berbilang penggantian ia boleh menggantikan nilai yang dimasukkan sebelum ini dengan yang lain. Lihat juga contoh di halaman ini.

Catatan:

Fungsi ini sensitif huruf besar-besaran. Gunakan str_ireplace() untuk penggantian tidak sensitif huruf besar-besaran.

PHP kini merupakan salah satu bahasa yang paling popular untuk melaksanakan aplikasi web. Kursus ini dikhaskan untuk mempelajari asasnya. Penekanan adalah pada aplikasi praktikal kemahiran yang diperolehi.

Bahasa PHP dicipta untuk menyelesaikan masalah praktikal tertentu di Internet (yang boleh didapati dengan membaca kuliah pertama kursus). Kami juga akan cuba untuk tidak terlalu terganggu oleh penaakulan teori, dan akan berusaha untuk menyelesaikan masalah tertentu dalam setiap kuliah. Kebanyakan contoh diambil daripada sistem kehidupan sebenar: muzium maya sejarah sains komputer. Bahagian pertama kursus ini dikhaskan untuk mengkaji asas sintaks dan struktur kawalan. Selepas ini, teknologi pelayan pelanggan dianggap sebagai kawasan aplikasi utama bahasa PHP. Kemudian kami meneruskan untuk mengkaji fungsi terbina dalam yang paling berguna pada pendapat kami dan menyelesaikan masalah praktikal dengan bantuan mereka. Walaupun model objek dalam bahasa PHP bukanlah yang paling kaya, kehadiran asasnya membolehkan anda menerangkan model data objek secara semula jadi. Sebagai model asas, model dokumen muzium sains komputer maya akan dipertimbangkan. Selepas ini, beberapa aspek yang digunakan akan dipertimbangkan: bekerja dengan sistem fail, dengan pangkalan data, rentetan, sesi, DOM XML - semua ini akan membolehkan kami mempertimbangkan tugas utama penggunaan praktikal bahasa tersebut.

Buku: Menggunakan Templat dalam PHP

Menggunakan Templat dalam PHP

Apakah templat dan mengapa ia diperlukan?

Apakah corak dalam bahasa pengaturcaraan? Kita boleh mengatakan bahawa templat ialah teks dengan pembolehubah di dalamnya. Apabila memproses templat, pembolehubah digantikan dengan nilainya.

Dalam salah satu kuliah kami telah melihat contoh templat. Ini adalah templat untuk memaparkan dokumen. Pengguna mencipta baris teks yang ditanda menggunakan tag HTML dan memasukkan ke dalamnya aksara meta khas (seperti ), yang kemudiannya digantikan oleh program kami dengan nilai elemen yang sepadan. Mengapa kita memerlukan templat sedemikian? Jadi, sebagai contoh, anda boleh menukar gaya paparan dokumen tanpa mengubah kod program.

Jawapan yang paling biasa kepada soalan mengapa templat diperlukan berbunyi seperti ini: templat diperlukan untuk memisahkan logik aplikasi daripada cara data dipersembahkan, iaitu daripada reka bentuk.

Contoh templat yang disediakan adalah antara yang paling mudah. Untuk memprosesnya, hanya fungsi penggantian str_replace() digunakan. Selalunya, untuk bekerja dengan templat, perpustakaan kelas dibuat. Pada dasarnya, tidak perlu membuat perpustakaan anda sendiri, kerana terdapat banyak perpustakaan templat yang diedarkan secara bebas, fungsinya diusahakan oleh pasukan besar pembangun, cuba menjadikannya universal, berkuasa dan pantas. Kami akan mempertimbangkan beberapa perpustakaan ini. Tetapi pertama, mari kita rumuskan masalah, menggunakan contoh penyelesaiannya untuk menunjukkan penggunaan pelbagai templat.

Jadi, tugas:

Ia diperlukan untuk menjana halaman web dengan senarai artikel yang tersedia dalam pangkalan data. Untuk kesederhanaan, kami menganggap bahawa artikel mempunyai tajuk tajuk, pengarang, abstrak ringkasan dan teks penuh kandungan penuh, yang dibentangkan sama ada sebagai teks dalam pangkalan data atau sebagai pautan ke fail. Senarai itu harus disusun supaya apabila anda mengklik pada tajuk artikel, kandungan penuhnya muncul dalam tetingkap baharu.

Corak kad bebas

Bagaimanakah masalah sedemikian boleh diselesaikan dengan penggantian mudah, i.e. kaedah yang kami gunakan untuk menyelesaikan masalah memaparkan dokumen?

Anda perlu menghasilkan templat untuk halaman ini dan menyimpannya di suatu tempat (dalam fail atau dalam pangkalan data). Jelas sekali, kami tidak boleh menghasilkan templat untuk keseluruhan halaman kerana kami tidak tahu berapa banyak artikel yang ada dalam pangkalan data. Dalam templat, kami bersetuju untuk menggunakan hanya html dan metacharacter. Oleh itu, kita hanya boleh menulis templat untuk satu baris senarai, yang mesti ditukar secara pemrograman kepada bilangan baris yang diperlukan.

  • sasaran=baru>
    ()

    Di samping itu, terdapat satu lagi halangan - dengan memaparkan pautan ke teks penuh artikel. Jika kita mengikuti peraturan penggantian (tukar semua metacharacter kepada nilainya dari pangkalan data), maka mungkin ternyata kita tidak memasukkan pautan ke teks, tetapi teks itu sendiri. Iaitu, elemen ini memerlukan pemeriksaan tambahan sebelum penggantian dan beberapa tindakan tambahan jika medan teks penuh mengandungi teks artikel dan bukan pautan ke fail. Janganlah merumitkan kehidupan kita dan bersetuju bahawa medan teks penuh sentiasa mengandungi pautan ke fail sahaja. Kemudian masalah itu boleh diselesaikan seperti berikut:

    Jika templat adalah sama seperti yang diberikan di atas, maka kita akan mendapat sesuatu seperti berikut.

    Pengenalan kepada PHP (Savelyeva N.V.)

    Kuliah itu memberi gambaran tentang apa itu bahasa PHP, mengapa ia dicipta pada asalnya dan bagaimana ia digunakan sekarang, apakah keupayaan yang dimilikinya.

    Pemasangan dan konfigurasi perisian (Ivan Ivanov)

    Pada dasarnya, kaedah ini agak mudah dan mudah, tetapi ia memerlukan usaha tambahan daripada pengaturcara apabila timbul masalah yang lebih kompleks daripada penggantian nilai mudah. Untuk menyelesaikan masalah di mana anda perlu menggantikan keseluruhan blok atau menyemak keadaan, kelas templat seperti FastTemplate dan Smarty dicipta. Mari kita bincangkan dengan lebih terperinci.

    FastTemplates

    FastTemplate ialah satu set kelas yang membolehkan anda bekerja dengan templat. Logik tidak boleh ditambahkan pada FastTemplate; semuanya mesti ada dalam kod program. Idea di sebalik templat FastTemplate ialah mana-mana halaman besar terdiri daripada banyak keping, yang terkecil adalah baris teks biasa, dan mereka diberi nama dan nilai.

    Apakah fail FastTemplate? Ini ialah fail html biasa yang mungkin mengandungi jenis pembolehubah khas yang kemudiannya diproses oleh kaedah kelas FastTemplate.

    Sintaks pembolehubah dalam templat FastTemplate diterangkan oleh ungkapan berikut: ((+))

    Ini bermakna pembolehubah mesti bermula dengan pendakap kerinting "(". Aksara kedua dan seterusnya mestilah huruf besar A hingga Z, nombor atau garis bawah. Pembolehubah dinilai menggunakan pendakap kerinting penutup ")".

    (TAJUK)
    (AUTH20)
    (TOP_OF_PAGE)

    Seperti yang telah disebutkan, idea utama FastTemplate adalah untuk membuat halaman menggunakan templat bersarang. Sebagai contoh, untuk menyelesaikan masalah kami, anda boleh membuat tiga fail templat:


    (TITLE_)


    (UTAMA)



      (LIST_ELEMENT)

  • (TAJUK)
    ((PENULIS))

    (ABSTRAK)

    Kami mencipta templat dan menyelesaikan kerja pereka bentuk. Sekarang anda perlu belajar cara memprosesnya, i.e. melakukan tugas pengaturcara. Sekarang mari kita buat program untuk memproses templat di atas.

    Sebelum anda mula bekerja dengan templat FastTemplate, anda perlu menyambungkan set kelas ini kepada program kami. Dalam kehidupan sebenar, satu set kelas FastTemplate ditulis dalam satu fail, biasanya dipanggil class.FastTemplate.php3, jadi anda boleh menyambungkannya, sebagai contoh, menggunakan arahan:

    include("class.FastTemplate.php3");

    Langkah penting seterusnya ialah mencipta objek kelas FastTemplate, yang kemudiannya akan kami kerjakan:

    $tpl = FastTemplate baharu(
    "/path/to/templates");

    Laluan ke tempat di mana templat kami berada diluluskan sebagai parameter.

    Untuk bekerja dengan FastTemplate anda perlu mengetahui empat kaedah utama: tentukan, tetapkan, parse dan FastPrint.

    tentukan kaedah

    Sintaks:

    define(array (kunci => nilai,
    kunci1 => nilai1, ...))

    Kaedah define() mengaitkan nama fail templat dengan nama yang lebih pendek yang boleh digunakan dalam atur cara. Iaitu, "kunci" ialah nama yang akan kami gunakan dalam program untuk memaut ke fail templat, yang namanya ditulis dalam baris "nilai". Ia tidak disyorkan untuk menggunakan nama fail templat sebenar di mana-mana kecuali dalam kaedah takrif. Apabila memanggil kaedah define(), semua templat yang ditakrifkan di dalamnya dimuatkan.

    $tpl->define(array (utama => "main.tpl",
    list_f => "list.tpl",
    list_el=> "list_element.tpl"));

    Di sini kami memberikan alias kepada nama fail templat. Nama samaran ini, i.e. pembolehubah utama, list_f dan list_el, akan digunakan dalam atur cara dan bukannya nama fail yang sepadan main.tpl, list.tpl dan list_element.tpl.

    menetapkan kaedah

    Sintaks:

    berikan ((pasangan kunci/nilai) atau
    (tatasusunan(pasangan kunci/nilai))

    Kaedah assign() memberikan nilai kepada pembolehubah, "kunci" ialah nama pembolehubah, dan "nilai" ialah nilai yang akan diberikan kepadanya. Agar pembolehubah dalam templat digantikan dengan nilai, nilai itu mesti diberikan kepadanya menggunakan kaedah assign(). Mengikut sintaks, kaedah ini boleh digunakan dalam dua bentuk yang berbeza. Terdapat hanya satu tatasusunan dalam FastTemplate, jadi jika anda menetapkan semula nilai kepada kunci yang sama, ia akan ditimpa.

    $tpl->assign(array(
    TITLE => "Pemasangan dan konfigurasi perisian",
    TITLE => "Pengenalan kepada PHP"));

    Di sini kami menetapkan nilai pembolehubah yang tersedia dalam fail templat yang dipanggil TITLE dua kali. Pembolehubah ini akan mempunyai nilai terakhir yang diberikan kepadanya, i.e. ia sama dengan baris "Pengenalan kepada PHP".

    kaedah menghurai

    Sintaks:

    menghuraikan (pembolehubah pulangan,
    sumber templat)

    Kaedah parse() adalah yang paling asas dalam FastTemplate. Ia menetapkan nilai pembolehubah yang dikembalikan kepada templat yang diproses daripada sumber yang ditentukan. Kaedah ini boleh digunakan dalam tiga bentuk: mudah, kompaun dan cantuman.

    $tpl->parse(UTAMA, "utama");
    // bentuk mudah
    $tpl->parse(MAIN, array ("list_f", "main"));
    // bentuk majmuk
    $tpl->parse(UTAMA, ".list_el");
    // borang penyertaan

    Dalam bentuk yang paling mudah, templat beralias "utama" dimuatkan (jika ia belum dimuatkan), semua pembolehubahnya digantikan dan hasilnya disimpan sebagai nilai pembolehubah UTAMA. Jika pembolehubah (MAIN) muncul dalam templat kemudian, ia akan digantikan dengan nilai yang diperoleh hasil pemprosesan templat "utama". Ini membolehkan anda membuat templat bersarang.

    Bentuk kompaun kaedah parse() direka untuk memudahkan templat bersarang antara satu sama lain. Entri berikut adalah setara:

    $tpl->parse(UTAMA, "list_f");
    $tpl->parse(UTAMA, ".utama");

    ini sama dengan

    $tpl->parse(MAIN, array("list_f", "main"));

    Apabila menggunakan bentuk kompaun, adalah penting bahawa setiap templat selepas yang pertama dalam senarai mengandungi pembolehubah yang mana hasil pemprosesan templat itu diluluskan. Dalam contoh di atas, main mesti mengandungi pembolehubah (MAIN), kerana di sinilah hasil pemprosesan templat list_f dipindahkan. Jika main tidak mengandungi pembolehubah (MAIN), maka hasil pemprosesan templat list_f akan hilang.

    Gaya penambahan membolehkan anda menambahkan hasil pemprosesan templat pada pembolehubah hasil. Titik sebelum alias fail templat memberitahu FastTemplate untuk menambahkan hasil pemprosesan templat itu kepada hasil yang dikembalikan dan bukannya menimpanya. Gaya ini paling kerap digunakan apabila membina jadual dengan bilangan baris yang berubah-ubah, yang diperoleh, sebagai contoh, hasil daripada pertanyaan pangkalan data.

    Kaedah FastPrint

    Sintaks:

    FastPrint (pembolehubah diproses)

    Kaedah FastPrint() mencetak kandungan pembolehubah yang diproses yang dihantar kepadanya. Jika ia dipanggil tanpa parameter, pembolehubah terakhir yang digunakan oleh kaedah parse() dicetak.

    $tpl->FastPrint();
    /* jika kita meneruskan contoh sebelumnya,
    maka fungsi ini akan mencetak nilai
    pembolehubah UTAMA */
    $tpl->FastPrint("UTAMA");
    // fungsi ini akan melakukan perkara yang sama

    Jika anda tidak perlu mencetak ke skrin, tetapi, sebagai contoh, ke fail, maka anda boleh mendapatkan pautan ke data menggunakan kaedah fetch().

    $data = $tpl->fetch("UTAMA");
    fwrite($fd, $data); // tulis data ke fail

    Menyelesaikan masalah menggunakan FastTemplates

    Sekarang mari kita cuba mengumpulkan semua kaedah yang dikaji untuk menyelesaikan masalah kita.

    Perhatikan bahawa penyelesaian kepada masalah itu ternyata agak lebih kompleks daripada dalam kes pertama, apabila hanya fungsi penggantian biasa digunakan. Tetapi di sini kita boleh menukar tiga templat berbeza (dokumen secara keseluruhan, senarai dan elemen senarai).

    Kelas templat ini muncul sebelum keluaran PHP4 untuk berfungsi dengan PHP3. Untuk menguji contoh yang diberikan, anda perlu memuat turun perpustakaan kelas FastTemplate dan menyalin fail ini ke direktori kerja anda. Jika anda bekerja dengan PHP4, maka anda perlu membuat beberapa perubahan pada fail class.FastTemplate.php3, yang diterangkan dalam dokumentasi yang disertakan dengan pustaka ini.

    Templat Smarty

    Smarty adalah salah satu projek PHP yang sedia ada, laman web rasminya ialah http://smarty.php.net. Di sana anda boleh memuat turun kedua-dua set kelas Smarty dan dokumentasi untuknya. Set kelas pemprosesan templat ini jauh lebih berkuasa dan berfungsi daripada FastTemplate. Bagaimanakah Smarty berbeza daripada kelas templat seperti FastTemplate? Pertama sekali, dia tidak sepenuhnya memisahkan logik daripada kandungan. Logik mengenai paparan data mungkin terdapat dalam templat, menurut pembangun Smarty. Oleh itu, templat Smarty boleh mengandungi penyataan bersyarat, penyata sisipan fail, penyataan perubahan pembolehubah, gelung, dsb. Satu lagi ciri Smarty ialah kompilasi templat. Templat diterjemahkan ke dalam kod PHP, dan jurubahasa PHP melakukan semua tindakan yang diperlukan untuk menggantikan nilai. Untuk mempercepatkan kerja, templat yang disusun dicache.

    Mari lihat beberapa reka bentuk asas enjin templat Smarty.

    Pemasangan

    Perkara pertama yang akan kita mulakan ialah memasang Smarty. Segala-galanya di sini tidak semudah dengan FastTemplate. Smarty tidak terdiri daripada satu fail PHP dengan penerangan kelas, tetapi satu set keseluruhan fail perpustakaan yang berbeza. Untuk bekerja dengan templat Smarty, anda perlu menyediakan perpustakaan ini untuk semua program anda. Ia terletak dalam direktori /libs/ bagi pengedaran Smarty. Fail yang mengandungi definisi kelas Smarty itu sendiri dipanggil Smarty.class.php. Untuk menyemak sama ada perpustakaan kelas Smarty tersedia, anda perlu menulis skrip berikut:

    Jika ralat berlaku semasa melaksanakannya, maka anda perlu mencuba salah satu daripada pilihan yang disenaraikan di bawah.

    Tambah direktori yang mengandungi perpustakaan untuk include_path (dalam kes ini tidak perlu menukar kod).

    Sekarang, selepas kami memastikan bahawa perpustakaan akan ditemui, kami perlu mencipta direktori yang diperlukan untuk Smarty berfungsi, yang secara lalai mempunyai nama berikut:

    Templat - direktori tempat kami akan menyimpan templat yang dibuat;

    Templates_c - direktori tempat Smarty akan menyimpan templat yang disusun;

    Configs - direktori untuk menyimpan fail konfigurasi;

    Cache - direktori cache.

    Nama-nama ini ditentukan oleh sifat $template_dir, $compile_dir, $config_dir, $cache_dir kelas Smarty, supaya ia boleh ditindih. Adalah disyorkan untuk menggunakan set direktori yang berbeza untuk setiap aplikasi yang berfungsi dengan templat Smarty. Direktori yang disenaraikan diakses oleh perpustakaan Smarty dan tidak pernah diakses secara langsung melalui pelayar web. Oleh itu, untuk mengelakkan masalah keselamatan, sebaiknya letakkan direktori ini di tempat yang tiada akses melalui www.

    Mari buat direktori yang disenaraikan oleh Smarty di c:/smarty_dirs/book/. Sila ambil perhatian bahawa anda tidak boleh membaca data dari sini melalui penyemak imbas. Biarkan program (atau aplikasi) kami ditempatkan di /~my/tasks/book/. Direktori Smarty $compile_dir dan $cache_dir memerlukan akses tulis, jadi anda perlu menetapkan kebenaran yang sesuai untuk pengguna rangkaian yang pelayan anda jalankan secara lalai (biasanya www atau tiada siapa).

    Untuk menguji tetapan yang telah kami buat, mari buat templat mudah dan program yang memprosesnya menggunakan enjin Smarty.

    index.tpl (ialah templat Smarty dan terletak dalam direktori templat c:/smarty_dirs/book/templates/)

    (*Templat pintar*)
    Hello, ($nama)!

    index.php (adalah kod program kami dan terletak dalam direktori /~my/tasks/book/ atau, yang sama, dalam direktori c:/users/my/tasks/book/)

    Akibatnya anda harus mendapat:

    Hello, Vasya!

    Semua tetapan yang diperlukan untuk pengendalian aplikasi kami boleh diletakkan dalam fail berasingan dan disusun sebagai lanjutan daripada kelas Smarty.

    Sintaks asas

    Smarty bukan sekadar kelas templat, ia mentakrifkan keseluruhan bahasa templat. Kami hanya akan menyentuh elemen utamanya. Jadi apakah templat Smarty? Ini ialah satu set binaan khas (pembolehubah, fungsi dan panggilan kaedah, dsb.) dan teg html. Semua elemen (tag) bahasa templat Smarty disertakan di antara aksara pembatas. Secara lalai ini ialah aksara pendakap kerinting "(" dan ")", tetapi anda boleh menukarnya. Semua yang tidak disertakan dalam pembatas tersebut dianggap oleh Smarty sebagai pemalar yang tidak memerlukan pemprosesan. Dalam templat index.tpl di atas, ($name) ialah pembolehubah dan rentetan "Hello," dan "!" - pemalar yang tidak berubah semasa pemprosesan templat.

    Komen dalam Smarty ditulis antara dua asterisk:

    (* Ini adalah ulasan. Selepas memproses templat
    ia tidak dipaparkan pada skrin *)

    Setiap teg Smarty sama ada memaparkan nilai pembolehubah atau memanggil fungsi. Fungsi ditulis seperti berikut:

    (function_name attribute1="value1"
    attribute2="value2")

    Pembolehubah templat boleh terdiri daripada beberapa jenis:

    Pembolehubah yang nilainya ditetapkan dalam skrip PHP pengguna mesti mempunyai tanda dolar di hadapan nama mereka.

    Contohnya: ($first_name)

    Elemen tatasusunan yang nilainya telah ditetapkan dalam skrip PHP pengguna tersedia dalam templat menggunakan sintaks ($array_name.associative_key).

    Contohnya: ($person.last_name)

    Elemen tatasusunan bukan bersekutu diakses menggunakan sintaks kurungan segi empat sama: (nama_susun[numeric_index])

    Contohnya: ($orang)

    Sifat objek yang dinyatakan dalam skrip PHP tersedia dalam templat menggunakan sintaks berikut: (object_name->property_name)

    Contohnya: ($orang->e-mel)

    Pembolehubah yang dimuatkan daripada fail konfigurasi (kami akan memberitahu anda sifatnya sedikit kemudian) disertakan di antara # simbol. Ia juga tersedia sebagai elemen tatasusunan bersekutu $smarty.config.

    Contohnya: (#bodyBgColor#) atau ($smarty.config.bodyBgColor)

    Selain itu, terdapat pembolehubah ($smarty) dikhaskan untuk beberapa pembolehubah templat khas, seperti pembolehubah permintaan HTTP, pembolehubah tarikh dan masa, dsb.

    Templat Smarty mentakrifkan beberapa pengubah suai yang boleh digunakan pada pembolehubah, fungsi yang ditentukan pengguna atau rentetan untuk mengubah suai nilainya. Untuk menggunakan pengubah suai, anda mesti menentukan namanya selepas bar menegak mengikut nama pembolehubah, fungsi atau baris yang digunakan.

    Contohnya, untuk menukar nilai pembolehubah ($tajuk) kepada huruf besar, anda perlu menggunakan pengubah atas padanya, i.e. tulis yang berikut: ($tajuk|atas)

    Anda boleh menggunakan beberapa pengubah suai sekaligus, memisahkannya antara satu sama lain dengan garis menegak lurus. Sebagai contoh, ($tajuk|atas|truncate) akan menukar nilai pembolehubah kepada huruf besar dan memotongnya kepada 80 aksara.

    Kami tidak akan menyenaraikan semua pengubah suai yang tersedia. Senarai mereka boleh didapati dalam dokumentasi Smarty. Katakan sahaja bahawa dengan bantuan mereka, anda boleh mengira bilangan aksara, perkataan dan perenggan, menambah baris, menetapkan format untuk memaparkan tarikh dan masa, membuat penggantian biasa dan banyak lagi.

    Fail konfigurasi

    Fail konfigurasi digunakan untuk mengurus pembolehubah global yang digunakan dalam templat menggunakan satu fail. Idea mereka sangat serupa dengan helaian gaya css. Fail konfigurasi mengandungi satu set pembolehubah dan nilainya. Nama pembolehubah tidak didahului oleh sebarang aksara tambahan seperti tanda dolar. Nilai pembolehubah secara pilihan disertakan dalam petikan (berganda atau tunggal); jika ia terdiri daripada beberapa baris, maka ia disertakan dalam petikan tiga kali ganda.

    # pembolehubah global
    pageTitle = "Senarai dokumen"!}
    bodyBgColor = #000000
    tableBgColor = #000000
    rowBgColor = #00ff00
    pageTitle = "Senarai artikel"!}
    Intro = """Nilai ini terdiri daripada
    beberapa baris. Oleh itu adalah perlu
    sertakan dalam petikan tiga kali ganda."""
    # bahagian tersembunyi
    [.Pangkalan data]
    hos=localhost
    db=buku
    pengguna=nina
    lulus=123

    Fail konfigurasi boleh terdiri daripada beberapa bahagian (bahagian), setiap satunya mempunyai nama dan boleh dimuatkan secara berasingan daripada bahagian lain. Nama bahagian disertakan dalam kurungan segi empat sama. Selain bahagian, fail konfigurasi mungkin mengandungi pembolehubah global - ia tidak disertakan dalam mana-mana bahagian dan sentiasa dimuatkan apabila fail konfigurasi dimuatkan. Jika satu bahagian dimuatkan, pembolehubah dan pembolehubah globalnya dimuatkan. Jika pembolehubah wujud sebagai pembolehubah global dan pembolehubah bahagian, maka pembolehubah bahagian digunakan. Jika anda menamakan dua pembolehubah yang sama dalam bahagian yang sama, yang terakhir akan digunakan. Dalam contoh di atas, terdapat dua bahagian - Pelanggan dan Pangkalan Data, dan sebagai tambahan kepada mereka, pembolehubah global pageTitle, bodyBgColor, tableBgColor dan rowBgColor ditetapkan.

    Untuk menyembunyikan nilai pembolehubah atau keseluruhan bahagian, anda perlu meletakkan titik di hadapan namanya. Dalam kes ini, apabila memuatkan fail konfigurasi, data ini tidak boleh dibaca. Dalam contoh, kami membuat bahagian Pangkalan Data tersembunyi supaya kata laluan dan nama pengguna yang digunakan untuk mewujudkan sambungan tidak dapat diketahui.

    campuran preg_replace (corak bercampur, penggantian bercampur, subjek bercampur [, had int])

    Mencari subjek rentetan untuk padanan corak dan menggantikannya dengan penggantian . Jika parameter had ditentukan, had kejadian templat akan diganti; jika had ditinggalkan atau sama dengan -1, semua kemunculan corak akan diganti.

    Penggantian boleh mengandungi rujukan dalam bentuk \\ n atau (sejak PHP 4.0.4) $n , dengan yang terakhir adalah lebih baik. Setiap rujukan tersebut akan digantikan dengan subrentetan yang sepadan dengan subpola n "n yang disertakan dalam kurungan. n boleh mengambil nilai dari 0 hingga 99, dengan rujukan \\0 (atau $0) sepadan dengan kejadian keseluruhan corak. Subcorak dinomborkan dari kiri ke kanan, bermula dengan satu .

    Apabila menggunakan penggantian kad bebas menggunakan rujukan subcorak, situasi mungkin timbul di mana topeng diikuti dengan serta-merta dengan nombor. Dalam kes ini, tatatanda seperti \\n mengakibatkan ralat: rujukan kepada subpola pertama diikuti dengan nombor 1 akan ditulis sebagai \\11 , yang akan ditafsirkan sebagai rujukan kepada subpola kesebelas. Salah faham ini boleh dihapuskan dengan menggunakan binaan \$(1)1, yang menunjukkan rujukan terpencil kepada subcorak pertama, diikuti dengan digit 1.

    Output contoh ini ialah:

    1 April 2003

    Jika padanan corak ditemui semasa pelaksanaan fungsi, nilai subjek yang diubah suai akan dikembalikan, jika tidak subjek asal akan dikembalikan.

    Tiga parameter pertama preg_replace() boleh menjadi tatasusunan satu dimensi. Sekiranya tatasusunan menggunakan kekunci, apabila memproses tatasusunan ia akan diambil mengikut susunan di mana ia terletak dalam tatasusunan. Menentukan kunci dalam tatasusunan untuk corak dan penggantian adalah pilihan. Jika anda memutuskan untuk menggunakan indeks untuk memadankan corak dan rentetan yang terlibat dalam penggantian, gunakan fungsi ksort() pada setiap tatasusunan.


    Contoh 2: Menggunakan tatasusunan dengan indeks angka sebagai argumen untuk preg_replace()

    Keputusan:

    Keputusan:

    Beruang hitam perlahan melompat ke atas anjing malas itu.

    Jika parameter subjek ialah tatasusunan, carian corak dan penggantian dilakukan untuk setiap elemennya. Hasil yang dikembalikan juga akan menjadi tatasusunan.

    Jika corak dan parameter penggantian ialah tatasusunan, preg_replace() secara bergilir-gilir mengambil sepasang elemen daripada kedua-dua tatasusunan dan menggunakannya untuk operasi mencari dan menggantikan. Jika tatasusunan gantian mengandungi lebih banyak elemen daripada pattern , rentetan kosong akan diambil untuk menggantikan elemen yang hilang. Jika corak ialah tatasusunan dan penggantian ialah rentetan, setiap elemen tatasusunan corak akan dicari dan digantikan dengan corak (semua elemen tatasusunan akan menjadi corak mengikut giliran, manakala rentetan gantian kekal tetap). Pilihan apabila corak ialah rentetan dan penggantian ialah tatasusunan tidak masuk akal.

    Pengubah suai /e mengubah tingkah laku fungsi preg_replace() sedemikian rupa sehingga parameter penggantian, selepas melakukan penggantian yang diperlukan, ditafsirkan sebagai kod PHP dan hanya kemudian digunakan untuk penggantian. Apabila menggunakan pengubah suai ini, berhati-hati: parameter penggantian mesti mengandungi kod PHP yang sah, jika tidak, ralat sintaks akan berlaku pada baris yang mengandungi panggilan fungsi preg_replace().


    Contoh 3. Penggantian menggunakan beberapa corak

    Contoh ini akan mengeluarkan:

    Menukar semua tag HTML kepada huruf besar


    Contoh 5: Penukar HTML ke Teks

    Nilai rentetan jenis ialah rentetan teks (string untuk pendek). Rentetan ialah urutan sifar atau lebih aksara. Aksara termasuk huruf, nombor, tanda baca, aksara khas dan ruang.

    Rentetan boleh ditakrifkan dalam empat cara yang berbeza:

    • petikan berganda
    • petikan tunggal
    • sintaks heredoc
    • sintaks nowdoc
    Rentetan dalam petikan berganda

    Rentetan dalam petikan berganda:

    Anda boleh menggunakan urutan melarikan diri dalam rentetan petikan dua kali. Urutan melarikan diri ialah aksara khas yang digunakan untuk memformat output teks. Urutan pelarian berikut tersedia dalam PHP:

    Sifat utama rentetan petikan dua kali ialah keupayaan untuk mengendalikan pembolehubah dalam rentetan.


    Tanda dolar: \$";

    Rentetan yang disertakan dalam petikan berganda boleh mengandungi aksara petikan tunggal:

    Echo "Petikan tunggal: "";

    Rentetan dalam petikan tunggal (apostrof)

    Rentetan dalam petikan tunggal:

    $str = "String"; echo "Satu baris besar boleh dipecahkan kepada beberapa baris kecil untuk memudahkan bacaan.";

    Tidak seperti rentetan petikan dua kali dan sintaks heredoc, pembolehubah dan jujukan kawalan (dengan satu pengecualian) yang disertakan dalam petikan tunggal tidak diproses. Ini bermakna bahawa mereka akan ditafsirkan sebagai aksara rentetan biasa:

    $num = 10; echo "Nombor: $num
    Tanda dolar: \$";

    Untuk dapat menggunakan petikan tunggal dalam rentetan yang dilampirkan dalam petikan tunggal, anda perlu melepaskannya menggunakan garis miring ke belakang (\"). Jika anda perlu menulis garis miring ke belakang itu sendiri, anda perlu menduplikasinya (\\):

    Gema "Gunakan petikan \"tunggal\" di dalam"; echo "Las balas: \\";

    Rentetan yang disertakan dalam petikan tunggal boleh mengandungi aksara petikan berganda:

    Echo "Petikan berganda: "";

    Sintaks Heredoc

    Sintaks Heredoc ialah cara alternatif untuk menulis rentetan.

    Rentetan yang ditakrifkan menggunakan sintaks Heredoc berfungsi sama seperti rentetan yang disertakan dalam petikan berganda. Perbezaan antara Heredoc dan rentetan petikan dua ialah dengan Heredoc tidak perlu melepaskan petikan berganda.

    Sintaks Heredoc bermula dengan tiga aksara