


Amalan PHP Preg_match: Panduan untuk mengekstrak digit dengan tepat pada akhir rentetan
1. Latar belakang dan cabaran masalah
Apabila berurusan dengan rentetan, terutamanya nama fail atau entri log, kita sering perlu mengekstrak maklumat dari format tertentu. Keperluan umum adalah untuk mengekstrak nombor dari akhir rentetan, yang mesti memenuhi syarat -syarat berikut:
- Ia berada di hujung rentetan.
- Ia segera diikuti oleh ruang.
- Ruang ini boleh didahului oleh mana -mana watak.
- Rentetan keseluruhan tidak boleh bermula dengan ruang.
Sebagai contoh, untuk rentetan "AB 1212" atau "A 1212", kami mengharapkan untuk mengekstrak 1212. Tetapi untuk rentetan "1212", ia tidak sepadan.
2. Percubaan dan analisis awal
Sesetengah percubaan regex biasa mungkin tidak memenuhi keperluan di atas.
Cuba satu: #^(.)* (\ D*) $ #
$ str = "1212"; preg_match ('#^(.)* (\ d*) $#', $ str, $ Matches); var_dump ($ perlawanan); // output: // array (3) { // [0] => String (6) "1212" // [1] => String (1) "" // [2] => String (4) "1212" //}
Analisis Masalah: Masalah dengan model ini ialah (.)*. * bermaksud sepadan dengan sifar atau beberapa kali, dan. Memadankan mana -mana watak kecuali rehat garis, termasuk ruang. Oleh itu, ^(.)* Boleh memadankan mana -mana ruang pada permulaan rentetan, mengakibatkan rentetan seperti "1212" dipadankan, yang tidak konsisten dengan keperluan kita.
Cuba dua: penyongsangan rentetan
$ str = "ab 1212"; preg_match ('#^(\ d*) (\ s*) (.*) $#', strrev ($ str), $ padanan); var_dump (strrev ($ padanan [1])); // output "1212" $ str = "1212"; preg_match ('#^(\ d*) (\ s*) (.*) $#', strrev ($ str), $ padanan); // Pada masa ini, $ perlawanan [1] adalah "2121" (dibalikkan 1212), $ perlawanan [2] adalah "" (tiada ruang), $ perlawanan [3] adalah "" // Hakim lebih lanjut bahawa $ perlawanan [2]! = '' Boleh dikecualikan.
Analisis Masalah: Kaedah ini diproses dengan membalikkan rentetan. Walaupun ia boleh melaksanakan fungsi, ia meningkatkan kerumitan kod dan tidak kondusif untuk memahami secara intuitif logik yang sepadan dengan ekspresi biasa. Kita harus mencari penyelesaian regex tulen.
3. Penyelesaian ungkapan biasa yang tepat
Untuk memenuhi semua syarat, kita perlu membina ekspresi biasa yang lebih berbutir. Inti adalah untuk memastikan rentetan tidak bermula dengan ruang dan sepadan dengan ruang akhir dan nombor tepat.
* Mod yang disyorkan: `"/\ s. (\ D) $/"` **
Mari merosakkan corak ini:
- ^: Padankan permulaan rentetan. Ini memastikan bahawa keseluruhan corak sepadan dari titik permulaan rentetan.
- \ S: Padankan mana-mana watak bukan Whitespace. Ini adalah titik utama, ia memaksa watak pertama rentetan menjadi ruang, dengan itu menghapuskan keadaan seperti "1212".
- .*: Padankan mana -mana watak (kecuali garis baru) sifar atau lebih kali. Ini dengan ketamakan sepadan dengan semua watak selepas ruang terakhir.
- ``: Padankan watak ruang literal. Ini memastikan bahawa ada pemisah ruang sebelum nombor.
- (\ d): Ini adalah kumpulan penangkapan.
- \ D: Padankan mana-mana nombor (0-9).
- : Padankan satu atau lebih elemen sebelumnya (iaitu satu atau lebih nombor).
- $: Padankan akhir rentetan. Ini memastikan nombor itu memang pada akhir rentetan.
Contoh kod:
Php fungsi ExtractNumberatend (String $ str) :? String { // Tentukan ungkapan biasa: // ^ - Padankan permulaan rentetan // \ s - sepadan dengan watak bukan Whitespace (mencegah rentetan dari awal dengan ruang) //.* - Padankan mana -mana aksara sifar atau beberapa kali (tamak sepadan dengan kandungan pertengahan) // \ s - Padankan watak ruang putih (di sini ia merujuk secara khusus ke ruang, anda juga boleh menggunakan '' untuk menjadi lebih jelas) // (\ d) - menangkap satu atau lebih nombor // $ - sepadan dengan akhir rentetan $ corak = "/^\.* (\ d) $/"; jika (preg_match (corak $, $ str, $ padanan)) { // $ perlawanan [0] mengandungi rentetan padanan lengkap // $ perlawanan [1] mengandungi kandungan kumpulan penangkapan pertama, iaitu nombor yang kita perlukan untuk mengembalikan $ perlawanan [1]; } kembali null; // Sekiranya tiada perlawanan dicapai, kembali null } // kes ujian echo "--- padanan sah ---". Php_eol; $ str1 = "ab 1212"; echo "String: '{$ str1}' -> Hasil ekstrak:". (ExtractNumberatend ($ str1) ?? "Tidak dipadankan"). Php_eol; // output: 1212 $ str2 = "Beberapa nama fail dengan versi 123"; echo "String: '{$ str2}' -> Hasil ekstrak:". (ExtractNumberatend ($ str2) ?? "Tidak dipadankan"). Php_eol; // output: 123 $ str3 = "Single_file 99"; echo "String: '{$ str3}' -> Hasil ekstrak:". (ExtractNumberatend ($ str3) ?? "Tidak dipadankan"). Php_eol; // output: 99 echo php_eol. "--- perlawanan tidak sah ---". Php_eol; $ str4 = "1212"; // Mula dengan ruang echo "String: '{$ str4}' -> Hasil ekstrak:". (ExtractNumberatend ($ str4) ?? "tidak sepadan"). Php_eol; // output: tidak dipadankan $ str5 = "filename123"; // Tiada ruang yang dipisahkan echo "String: '{$ str5}' -> Hasil ekstrak:". (ExtractNumberatend ($ str5) ?? "Tidak dipadankan"). Php_eol; // output: tidak dipadankan $ str6 = "nama fail 123"; // Terdapat ruang selepas nombor echo "String: '{$ str6}' -> Hasil ekstrak:". (ExtractNumberatend ($ str6) ?? "tidak dipadankan"). Php_eol; // output: tidak dipadankan $ str7 = "tiada nombor di sini"; // Tiada nombor echo "String: '{$ str7}' -> Hasil ekstrak:". (ExtractNumberatend ($ str7) ?? "Tidak dipadankan"). Php_eol; // output: tidak dipadankan $ str8 = "1234 lkjsdhf ldjfh 1223"; // pelbagai ruang echo "String: '{$ str8}' -> Extract Result:". (ExtractNumberatend ($ str8) ?? "Tidak dipadankan"). Php_eol; // output: 1223 ?>
Dalam contoh di atas, $ perlawanan [1] akan mengandungi nombor yang ditangkap. Jika perlawanan gagal, preg_match mengembalikan 0, dan array perlawanan $ tidak akan diisi.
4. Langkah berjaga -jaga dan amalan terbaik
- Kepentingan titik utama ( ^ dan $): ^ dan $ memastikan bahawa ungkapan biasa sepadan dengan keseluruhan rentetan, bukan substring dalam rentetan. Ini penting untuk memadankan permulaan dan akhir rentetan.
- Peranan \ s: \ s adalah kunci untuk mencegah rentetan dari awal dengan ruang. Jika anda membenarkan untuk memulakan dengan ruang, anda boleh menghilangkan atau menggantikannya.
- Kumpulan menangkap (()): Gunakan kurungan () untuk membuat kumpulan penangkapan supaya preg_match dapat mengekstrak nombor yang sepadan secara berasingan. Dalam kes ini, (\ d) adalah kumpulan penangkapan pertama dan hanya, jadi hasilnya disimpan dalam $ perlawanan [1].
- Pengendalian ralat: Sentiasa periksa nilai pulangan preg_match. Jika 0 dikembalikan, tiada perlawanan ditemui, dan anda tidak boleh cuba mengakses array $ perlawanan untuk mengelakkan amaran atau kesilapan PHP.
- Corak Pembatas: Dalam PHP, ungkapan biasa perlu dibungkus dengan pembatas, seperti /.../, # ... # atau ~ ... ~. Pilih watak yang tidak muncul di dalam corak sebagai pembatas.
- \ b (sempadan perkataan) Pilihan: \ b (\ b \ d) disebut dalam jawapan soalan asal. Dalam contoh ini, kerana bilangannya mempunyai ruang yang jelas sebelum itu dan pada akhir rentetan, kesan \ b agak kecil, kerana ruang sudah memainkan peranan sempadan perkataan. Tetapi jika coraknya lebih kompleks, \ b dapat membantu memastikan perlawanan itu adalah "perkataan" yang lengkap dan bukannya sebahagian daripada perkataan. Untuk ^\ S.* (\ d) $, ia sudah cukup mantap.
5. Ringkasan
Dengan ekspresi biasa yang dibina dengan teliti ^\ S.* (\ d) $, kita boleh mengekstrak nombor dengan cekap dan tepat yang memenuhi syarat -syarat tertentu dari akhir rentetan. Memahami peranan setiap metacharacter, terutamanya sauh ^ dan $ dan watak-watak bukan Whitespace \ s, adalah kunci untuk menulis ungkapan biasa yang mantap. Kaedah ini bukan sahaja mengelakkan operasi kompleks seperti penyongsangan rentetan, tetapi juga meningkatkan kebolehbacaan dan penyelenggaraan kod.
Atas ialah kandungan terperinci Amalan PHP Preg_match: Panduan untuk mengekstrak digit dengan tepat pada akhir rentetan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT
Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

UseFilter_var () TOVALIDATEMailSyntaxandCheckDnsrr () TOVERIFYDOnMAINMXRECORDS.example: $ e -mel = "user@example.com"; if (filter_var ($ e -mel, filter_email) && checkDnsrr (expode '

UseArray_Merge () toCombineArrays, OverwritingDuplicateStringKeySandreIndexingNumericKeys; forsimplerconcatenation, terutamaInphp5.6, usethesplatoperator [... $ array1, ... $ array2].

UseUnserialize (Serialize ($ obj)) fordeepcopyingWhenallDataisserizable; jika tidak, pelaksanaan__clone () tomanuallyduplicatenestedObjectsandavoidsharedReferences.

Artikel ini membincangkan secara mendalam bagaimana menggunakan pernyataan kes untuk melakukan pengagregatan bersyarat di MySQL untuk mencapai penjumlahan bersyarat dan mengira bidang tertentu. Melalui kes sistem langganan praktikal, ia menunjukkan bagaimana secara dinamik mengira jumlah tempoh dan bilangan peristiwa berdasarkan status rekod (seperti "akhir" dan "membatalkan"), dengan itu mengatasi batasan fungsi jumlah tradisional yang tidak dapat memenuhi keperluan pengagregatan bersyarat kompleks. Tutorial menganalisis penerapan pernyataan kes dalam jumlah fungsi secara terperinci dan menekankan pentingnya bersatu ketika berurusan dengan nilai nol yang mungkin dari gabungan kiri.

Namespacesinphporganizecodeandpreventnamingnamingconflictsbygroupinglasses, antara muka, fungsi, dan constantsunderaspecificname.2.defineAnamespaceusingthenamespaceywordetopofafile, diikuti olehbythenamespaceakenam

The__call () methodistriggeredWhenaninaccessibleorundefinedmethodiscalledonanObject, membolehkanCustomHandlylyAccepteThemeThodnamnamnamnents, asshownwhencallingundefinedmethodslikesayhello ()

Toupdateadatabaserecordinphp, firstConnectusingPdoormySqli, thenusePePreparedStatementStoExecuteAseCureSqlupDateQuery.example: $ pdo = newpdo ("mysql: host = localhost; dbName = your_database: $ userbase: $ userbase"

UsePathinfo ($ FileName, pathinfo_extension) togetthefileextension; itreliLyHandlesmultipledotsandgecases, returnTheExtension (mis., "Pdf") Oranemptystringifnoneexists.
