Menggunakan ob_start apabila menyokong projek php. Ob_start - Dayakan penimbal keluaran Brovka carian php mula

Fungsi substr() mengembalikan sebahagian daripada rentetan.

Catatan: Jika parameter permulaan ialah nombor negatif dan panjang kurang daripada atau sama dengan permulaan, panjang menjadi 0.

Sintaks

substr( rentetan, permulaan, panjang)


Parameter Penerangan
tali Diperlukan. Menentukan rentetan untuk mengembalikan sebahagian daripada
mulakan Diperlukan. Menentukan tempat untuk bermula dalam rentetan
  • Nombor positif - Mulakan pada kedudukan yang ditentukan dalam rentetan
  • Nombor negatif - Mulakan pada kedudukan yang ditentukan dari hujung rentetan
  • 0 - Mulakan pada aksara pertama dalam rentetan
panjang Pilihan. Menentukan panjang rentetan yang dikembalikan. Lalai ialah ke hujung rentetan.
  • Nombor positif - Panjang yang akan dikembalikan dari parameter permulaan
  • Nombor negatif - Panjang yang akan dikembalikan dari hujung rentetan

Butiran Teknikal

Nilai Pulangan: Mengembalikan bahagian rentetan yang diekstrak, atau FALSE pada kegagalan, atau rentetan kosong
Versi PHP: 4+
Changelog: Dalam PHP Versi 5.2.2 hingga 5.2.6, jika parameter mula menunjukkan kedudukan pemangkasan negatif atau seterusnya, FALSE dikembalikan. Versi lain mendapat rentetan dari mula

Lagi Contoh

Contoh 1

Menggunakan parameter permulaan dengan nombor positif dan negatif yang berbeza:

echo substr("Hello world",10)."
";
echo substr("Hello world",1)."
";
echo substr("Hello world",3)."
";
echo substr("Hello world",7)."
";

echo substr("Hello world",-1)."
";
echo substr("Hello world",-10)."
";
echo substr("Hello world",-8)."
";
echo substr("Hello world",-4)."
";

(PHP 4, PHP 5, PHP 7)

ob_start — Dayakan penimbalan output

Penerangan

Bool ob_start ([ boleh dipanggil$output_callback = NULL [, int $chunk_size = 0 [, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS ]]])

Fungsi ini membolehkan penimbalan output. Jika penimbalan output aktif, output skrip tidak dihantar (kecuali pengepala), tetapi disimpan dalam penimbal dalaman.

Kandungan penimbal dalaman ini boleh disalin ke pembolehubah rentetan menggunakan ob_get_contents(). Untuk mengeluarkan kandungan penimbal dalaman, gunakan ob_end_flush(). Sebagai alternatif anda boleh gunakan ob_end_clean() untuk memusnahkan kandungan penimbal.

Perhatian

Sesetengah pelayan web (contohnya Apache) menukar direktori kerja skrip apabila fungsi panggil balik dipanggil. Anda boleh mendapatkannya kembali menggunakan chdir(nama nama($_SERVER["SCRIPT_FILENAME"])) dalam fungsi panggil balik.

Penampan keluaran ditolak ke tindanan, bermakna panggilan dibenarkan ob_start() selepas memanggil yang lain aktif ob_start(). Dalam kes ini adalah perlu untuk memanggil ob_end_flush() bilangan kali yang sesuai. Jika berbilang fungsi panggil balik aktif, output ditapis secara berurutan untuk setiap satu daripadanya dalam susunan bersarang.

Senarai parameter

Parameter output_callback pilihan boleh ditentukan. Fungsi ini mengambil rentetan sebagai hujah dan mesti mengembalikan rentetan. Ia dipanggil apabila tetapan semula (hantar) atau pembersihan (menggunakan ob_flush(), ob_clean() atau fungsi yang serupa) atau jika penimbal output dialihkan ke penyemak imbas pada akhir permintaan. Apabila fungsi output_callback dipanggil, ia menerima kandungan penimbal dan mesti mengembalikan kandungan yang dikemas kini untuk penimbal output untuk dihantar ke penyemak imbas. Jika output_callback bukan fungsi yang sah, maka fungsi yang didokumenkan akan kembali SALAH. Penerangan fungsi untuk parameter ini:

Tali pengendali (rentetan $penampan [, int $fasa ])

Penampan Kandungan penimbal keluaran. fasa Topeng bit pemalar PHP_OUTPUT_HANDLER_*.

Jika output_callback kembali SALAH, maka maklumat asal akan dihantar ke penyemak imbas tanpa perubahan.

Parameter output_callback boleh diabaikan dengan menghantar nilai NULL.

ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() Dan ob_start() tidak boleh dipanggil daripada fungsi panggil balik, kerana kelakuannya tidak dapat diramalkan. Jika anda ingin memadamkan kandungan penimbal, kemudian kembalikan "" (rentetan kosong) daripada fungsi panggil balik. Anda juga tidak boleh memanggil fungsi print_r($ungkapan, benar) atau highlight_file($filename, true) daripada fungsi panggil balik penimbalan output.

Komen:

Dalam PHP 4.0.4 fungsi ob_gzhandler() telah diperkenalkan untuk memudahkan penghantaran data berkod gz kepada penyemak imbas web yang menyokong halaman web yang dimampatkan. ob_gzhandler() menentukan jenis pengekodan kandungan yang diterima oleh penyemak imbas dan mengembalikan output dengan sewajarnya.

saiz_ketulan

Jika parameter chunk_size pilihan diluluskan, penimbal akan dipadamkan selepas sebarang output yang lebih besar daripada atau sama dengan saiz chunk_size. Nilai asal 0 bermakna fungsi output akan dipanggil apabila penimbal ditutup.

Sebelum PHP 5.4.0, nilai 1 ialah nilai khas yang menetapkan parameter saiz_ketulan di 4096.

Parameter flags ialah bitmask yang mengawal operasi yang boleh dilakukan pada penimbal output. Secara lalai, ia membenarkan penimbal output dibilas, disiram dan dipadamkan, yang sama seperti | | , atau PHP_OUTPUT_HANDLER_STDFLAGS sebagai singkatan untuk gabungan ini.

Setiap bendera mengawal akses kepada satu set fungsi, seperti yang diterangkan di bawah:

berterusan Fungsi
PHP_OUTPUT_HANDLER_CLEANABLE ob_clean(), ob_end_clean(), Dan ob_get_clean().
PHP_OUTPUT_HANDLER_FLUSHABLE ob_end_flush(), ob_flush(), Dan ob_get_flush().
PHP_OUTPUT_HANDLER_REMOVABLE ob_end_clean(), ob_end_flush(), Dan ob_get_flush().

Kembalikan nilai

Pulangan BENAR apabila berjaya disiapkan atau SALAH jika ralat berlaku.

Senarai perubahan

Versi Penerangan
7.0.0 Jika ob_start() digunakan di dalam fungsi panggil balik penimbal keluaran, fungsi ini tidak akan menjana ralat lagi E_ERROR, tetapi sebaliknya akan memanggil E_RECOVERABLE_ERROR, membenarkan pengendali ralat pihak ketiga menangkapnya.
5.4.0 Parameter ketiga ob_start() ditukar daripada boolean ( boolean) daripada parameter padam (yang, apabila ditetapkan kepada SALAH menghalang penimbal daripada dipadamkan sehingga skrip selesai) kepada integer ( integer) parameter bendera. Malangnya, ini bermakna ketidakserasian API untuk kod yang menggunakan parameter ketiga sebelum PHP 5.4.0. Lihat contoh bendera untuk memahami cara bekerja dengan kod supaya ia serasi dengan kedua-dua versi.
5.4.0 Parameter saiz_ketulan, dipasang di 1 , kini menghasilkan 1 bait sebagai output kepada penimbal output.
4.3.2 Fungsi akan kembali SALAH sekiranya output_callback tidak dapat dilaksanakan.

Contoh

Contoh #1 Contoh fungsi panggil balik yang ditentukan pengguna

Panggilan balik fungsi ($buffer)
{
// gantikan semua epal dengan oren
return (str_replace("epal", "oren", $buffer));
}

Ob_start("panggilan balik");

?>


Ia seperti membandingkan epal dan oren.






ob_end_flush();

Hello, Habr!

Hari ini saya ingin memperkenalkan juruweb baru kepada pelbagai cara yang kemas untuk menggunakan penimbalan output dalam PHP. Juruweb yang berpengalaman tidak mungkin menemui sesuatu yang berguna di sini. Walaupun - siapa tahu?

Seperti yang anda semua tahu, penimbalan output dalam php dikawal oleh satu set fungsi bermula dengan "ob_". Yang paling penting ialah ob_start. Apabila dilancarkan, ia mengumpul keluaran berikutnya, iaitu, semua jenis cetakan(), gema, dsb., yang kemudiannya diberikan kepada pelawat dalam bentuk halaman html. Dan jika kita mula menimbal sebelum mengeluarkan, maka kita akhirnya boleh melakukan sesuatu dengan halaman yang hampir siap ini.


Sebagai contoh, kami ingin menapis semua pautan ke tapak luar.

Di forum kami, setua kapak Australopithecus, sebilangan besar spammer berkerumun, memikat pelawat ke tempat-tempat yang penuh dengan pesta pora, penyamun bersenjata satu dan pergolakan politik. Kami boleh menggunakan js dengan penjejakan, tetapi kami mahu menukar semua pautan ini seperti ini:

"http://blackjack-hookers.com" => "http://myoldforum.ru/redirect.php?url=blackjack-hookers.com"

Kaedah ini mungkin bukan yang paling berkesan, tetapi ia berkesan. Kami menulis redirect.php dengan penapis dan senarai hitam, dan kini kami perlu menukar semua pautan pada beribu-ribu halaman forum. Menggunakan ob_start dan beberapa ungkapan biasa, kita boleh melakukan ini dalam beberapa baris sahaja:

Fungsi f_callback($buffer)( $buffer = preg_replace("#http://(www.)?myoldforum\.ru/#","/",$buffer); $buffer = preg_replace("#href="http ://([^"]*)"#","#href="/redirect\.php\?url=$1",$buffer return $buffer) ob_start(f_callback);

Sekarang, dengan memasukkan kod ini pada permulaan index.php, atau fail lain yang diakses oleh pelayan semasa melihat halaman, kami akan mendapat apa yang kami perlukan.

Dengan menukar kandungan dengan cara ini, kami tidak terhad oleh kaedah enjin. Ini boleh menjadi sangat berharga. Sebagai contoh, anda boleh menambah pemalam:

Fungsi generate_plugin() ( /*generate something*/ ) function f_callback($buffer)( /*...*/ $buffer = str_replace ("",generate_plugin(),$buffer); /*...*/ return $buffer; ) ob_start("f_callback");

Sekarang, di mana kami menambah kandungan, perkara yang kami mahu akan muncul. Salah satu aplikasinya ialah memasukkan widget js ke halaman tapak web. Sebagai contoh, peta Yandex. Biasanya ini tidak sukar, tetapi kadangkala editor halaman laman web yang ditulis dengan buruk terlepas petikan dan pendakap kerinting, memecahkan widget. Seperti yang anda lihat, masalah ini mudah diselesaikan.

Set alat PHP untuk bekerja dengan penimbal output adalah kaya, dan tidak terhad kepada ob_start sahaja. Kaedah yang diterangkan di atas dalam beberapa kes adalah terlalu intensif sumber dan menyusahkan, kerana ia beroperasi pada keseluruhan halaman. Kami hanya boleh memproses sebahagian daripadanya dengan membuat pembungkus dalam templat di sekitar penjanaan sesuatu yang kami tidak mahu masuk ke dalamnya, tetapi itu pastinya perlu diperbaiki:

(JANA PERKARA GILA BESAR)

Anda pasti sudah perasan semua frasa ini: "Saya tidak mahu masuk ke dalamnya," "sekuno seperti kerusi tyrannosaurus," "editor bertulis yang bengkok"... Dalam dunia yang ideal, cangkang di sekitar penimbal keluaran adalah tidak diperlukan. Semua yang boleh dilakukan dengan ob_start secara teorinya boleh dilakukan tanpanya. Teknik ini kadangkala menimbulkan kekeliruan ke dalam kod projek, ramai yang melihat maksudnya hanya dalam menghantar output ke ob_gzhandler untuk pemampatan, dan menganggap penggunaannya dalam kes lain berbahaya. Tetapi selalunya anda tidak boleh melakukannya tanpa kawalan output.

Terutama jika anda tidak mahu menggali lebih dalam.

PHP menyediakan beberapa fungsi yang mencari satu rentetan dalam rentetan yang lain. Ada yang mengembalikan lokasi rentetan yang ditemui (strpos , strrpos dan yang berkaitan), dan mengembalikan sebahagian daripada rentetan asal (strstr dan strrchr). Fungsi carian kembali palsu jika rentetan yang anda cari tidak ditemui dalam asal.

Jika matlamat anda hanyalah untuk menentukan sama ada satu rentetan wujud dalam rentetan yang lain, pilihan yang paling cekap ialah strpos .

strpos

Fungsi strpos mencari hujah rentetan pertamanya untuk yang kedua dan mengembalikan lokasi indeks berasaskan sifar pada padanan pertama dalam rentetan, atau palsu jika ia tidak ditemui. Contoh berikut menunjukkan:

$str = ; // cari kejadian pertama "keperluan" dalam $str$pos = strpos($str, "perlu"); // jenis paparan dan nilai $pos var_dump ($pos); // int(3)

Walaupun kami menunjukkan keputusan menggunakan var_dump di atas, pemeriksaan biasa nilai pulangan untuk strpos dilakukan seperti berikut:

// bagaimana untuk memeriksa nilai pulangan strpos ($pos) if ( $pos !== false ) ( // jika rentetan carian ditemui echo "temuinya di lokasi $pos" ; ) else ( echo "not found." ; )

Pastikan anda menggunakan operator === atau !== untuk membandingkan nilai pulangan fungsi strpos kepada false . Jika subrentetan ditemui pada permulaan rentetan, strpos akan mengembalikan 0 , yang mana operator == atau != akan menukar kepada palsu.

Anda boleh menentukan offset untuk memulakan carian bilangan aksara tertentu dari permulaan rentetan, seperti yang ditunjukkan oleh contoh ini:

/* argumen strpos: * rentetan subjek (aka tumpukan jerami), rentetan carian (jarum), offset (pilihan) */ // mulakan carian untuk "keperluan" daripada aksara 10 dalam $str$pos = strpos ($str , "keperluan" , 10 ); // 20

Apabila memulakan carian dari aksara 10, hasilnya ialah 20, lokasi indeks permulaan perkataan jarum.

strrpos

Fungsi strrpos mencari kedudukan kejadian terakhir subrentetan dalam rentetan:

// contoh rentetan untuk digunakan untuk carian$str = "Kita perlu mencari jarum dalam timbunan jerami."; // cari lokasi kejadian terakhir "keperluan" dalam $str$pos = strrpos ($str , "perlu" ); // 20

Fungsi strrpos juga menyediakan parameter offset pilihan yang boleh sama ada positif atau negatif. Jika offset adalah positif, bilangan aksara itu pada permulaan rentetan akan dikecualikan daripada carian. Pertimbangkan contoh berikut:

// cari dari kanan untuk "Kami" tidak termasuk 3 aksara pertama$pos = strrpos ($str , "Kami" , 3 ); var_dump ($pos); // bool(false)

Hasilnya adalah palsu kerana "Kami" tidak ditemui apabila carian mengecualikan tiga aksara pertama.

Jika offset adalah negatif, bahawa banyak aksara pada penghujung rentetan dikecualikan daripada carian. Kami menunjukkan dengan dua carian yang menyatakan offset negatif:

// cari dari kanan untuk "hay" tidak termasuk 5 aksara terakhir$pos = strrpos ($str , "hay" , - 5 ); // int(34) // cari dari kanan tidak termasuk 10 aksara terakhir$pos = strrpos ($str , "hay" , - 10 ); //bool(false)

Keputusan terakhir di atas adalah palsu kerana "hay" tidak ditemui apabila carian mengecualikan 10 aksara terakhir.

Perhatikan bahawa nilai pulangan fungsi strrpos memberikan lokasi dari permulaan rentetan, walaupun carian bermula dari kanan.

stripos dan stripos

Fungsi strpos dan strrpos melakukan carian sensitif huruf besar-besaran. PHP menyediakan fungsi stripos dan srripos untuk melakukan carian tidak sensitif huruf besar-besaran. Mereka berfungsi sama seperti persamaan sensitif huruf besar-besaran mereka:

// contoh rentetan untuk digunakan untuk carian$str = "Kita perlu mencari jarum dalam timbunan jerami."; // lakukan carian tidak peka huruf besar-kecil untuk "kami"$pos = stripos($str, "kami"); // int(0) // lakukan carian tidak sensitif huruf kecil dari kanan untuk "Keperluan"$pos = strripos($str, "Perlu"); // int(20)

Carian tidak sensitif huruf besar-besaran untuk "kami" menghasilkan 0 , menunjukkan ia ditemui pada permulaan rentetan yang kami cari. Carian tidak sensitif huruf besar-besaran untuk "Perlu" dari kanan (menggunakan strripos), menemuinya di lokasi 20 .

strstr

Fungsi strstr mencari hujah rentetan pertama untuk yang kedua. Jika yang kedua ditemui dalam yang pertama, strstr mengembalikan bahagian rentetan asal bermula daripada kejadian pertama ditemui hingga ke penghujung rentetan.

// contoh rentetan $str = "Kita perlu mencari jarum dalam timbunan jerami."; // search for "the" in $str $newstr = strstr ($str , "the" ); var_dump ($newstr) ; // string(27) "jarum dalam timbunan jerami."

Fungsi strstr mengembalikan "yang" pertama yang ditemuinya, bersama-sama dengan rentetan asal yang lain.

Jika anda menghantar benar sebagai hujah ketiga kepada strstr , bahagian rentetan asal sebelum ini rentetan yang ditemui dikembalikan:

// pass true untuk mengembalikan bahagian $str sebelum "the"$newstr = strstr ($str , "the" , true ); var_dump ($newstr) ; // string(16) "Kita perlu mencari "

Kali ini fungsi strstr mengembalikan segala-galanya sebelum "the" pertama dalam rentetan.

PHP juga menyediakan fungsi strstr yang berfungsi sama seperti strstr kecuali ia melakukan carian tidak peka huruf besar-besaran.

strhrchr

Fungsi strrchr mencari hujah rentetan pertama dari sebelah kanan untuk watak yang kita tentukan dalam hujah kedua. Fungsi mengembalikan bahagian rentetan dari lokasi contoh yang ditemui bagi aksara itu ke penghujung rentetan:

// contoh rentetan $str = "Kita perlu mencari jarum dalam timbunan jerami."; // cari dari kanan untuk "s" dalam $str$newstr = strstr ($str , "s" ); var_dump ($newstr) ; // rentetan(6) "timbunan."

Perhatikan bahawa tidak seperti strstr , jika argumen kedua terdiri daripada berbilang aksara, hanya yang pertama digunakan:

// ujian dengan hujah kedua berbilang aksara$newstr = strrchr ($str , "the" ); var_dump ($newstr) ; // string(5) "tack."

Daripada mengembalikan "timbunan jerami" , fungsi strrchr mengembalikan "tack" , menggunakan hanya huruf pertama argumen kedua pada carian.