Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah maksud ungkapan biasa php?

Apakah maksud ungkapan biasa php?

青灯夜游
青灯夜游asal
2023-02-08 13:43:254271semak imbas

Dalam PHP, ungkapan biasa ialah peraturan tatabahasa tersuai yang menerangkan corak susunan aksara Ia mempunyai sistem tatabahasa yang sangat lengkap yang boleh menulis corak, menyediakan kaedah pemprosesan Rentetan aksara yang fleksibel dan intuitif. Ungkapan biasa menerangkan corak padanan rentetan yang boleh digunakan untuk menyemak sama ada rentetan mengandungi subrentetan tertentu, menggantikan subrentetan yang sepadan atau mengekstrak subrentetan yang memenuhi syarat tertentu daripada rentetan, dsb. tunggu.

Apakah maksud ungkapan biasa php?

Persekitaran pengendalian tutorial ini: sistem windows7, versi PHP8, komputer DELL G3

Mungkin anda pernah mendengar ungkapan biasa sebelum ini, kira-kira Tanggapannya adalah sukar untuk dipelajari, sangat rumit, dan mempunyai perasaan tidak dapat difahami. Malah, ungkapan biasa tidak begitu misteri Ia adalah peraturan tatabahasa tersuai yang menerangkan corak susunan watak.

Apakah itu ungkapan biasa

Ungkapan biasa juga dipanggil ungkapan corak, yang mempunyai set corak yang sangat lengkap yang boleh ditulis Sintaks sistem menyediakan kaedah pemprosesan rentetan yang fleksibel dan intuitif. Ungkapan biasa membina corak dengan peraturan tertentu, membandingkannya dengan maklumat rentetan input dan menggunakannya dalam fungsi khusus untuk mencapai operasi seperti padanan rentetan, carian, penggantian dan pembahagian.

Sebagai contoh dalam kehidupan seharian kita, jika anda ingin mencari semua fail format txt dalam direktori tertentu pada komputer anda, anda boleh memasukkan *.txt dalam direktori dan tekan kekunci Enter List all txt memformat fail dalam direktori. *.txt yang digunakan di sini boleh difahami sebagai ungkapan biasa yang mudah.

Dua contoh berikut dibina menggunakan sintaks ungkapan biasa, seperti yang ditunjukkan di bawah:

/http(s)?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is      // 匹配网址 URL 的正则表达式
/^\w{3,}@([a-z]{2,7}|[0-9]{3})\.(com|cn)$/                    // 匹配邮箱地址的正则表达式

Jangan tertunda oleh rentetan yang kelihatan bercelaru dalam contoh di atas, ia adalah seperti berikut Peraturan tatabahasa ungkapan biasa dibina sebagai rentetan yang terdiri daripada aksara biasa dan aksara dengan fungsi khas. Dan rentetan ini mesti digunakan dalam fungsi ungkapan biasa tertentu untuk menjadi berkesan.

Tujuan ungkapan biasa

Ungkapan biasa menerangkan corak padanan rentetan yang boleh digunakan untuk menyemak Sama ada rentetan mengandungi subrentetan tertentu, menggantikan subrentetan yang sepadan atau mengekstrak subrentetan yang memenuhi syarat tertentu daripada rentetan, dsb. Contohnya, apabila pengguna menyerahkan borang, untuk menentukan sama ada nombor telefon, alamat e-mel, dsb. yang dimasukkan adalah sah, pengesahan aksara berasaskan literal biasa jelas tidak mencukupi.

Ungkapan biasa ialah corak literal yang terdiri daripada aksara biasa (seperti aksara a hingga z) serta aksara khas yang dipanggil "metacharacters". Ungkapan biasa bertindak sebagai templat yang sepadan dengan corak aksara dengan rentetan yang dicari. Corak ungkapan biasa boleh menjadi satu aksara, koleksi aksara, julat aksara, pilihan antara aksara atau mana-mana gabungan semua komponen ini.

Tujuan menggunakan ungkapan biasa adalah untuk mencapai fungsi berkuasa dengan cara yang mudah. Untuk menjadi mudah, berkesan dan berkuasa, peraturan ungkapan biasa adalah rumit. Ia adalah lebih sukar untuk membina ungkapan biasa yang betul dan berkesan, jadi ia memerlukan sedikit usaha. Selepas bermula, melalui rujukan tertentu dan banyak latihan, agak berkesan dan menarik untuk menggunakan ungkapan biasa dalam amalan pembangunan.

Istilah biasa dalam ungkapan biasa

Sebelum mempelajari ungkapan biasa, mari kita fahami beberapa daripadanya Ini adalah istilah yang mudah dikelirukan, yang sangat membantu dalam mempelajari ungkapan biasa.

1) grep

pada asalnya ialah arahan dalam editor ED, digunakan untuk memaparkan kandungan tertentu dalam fail. Kemudian menjadi grep alat kendiri.

2) egrep

Walaupun grep sentiasa dikemas kini dan dinaik taraf, ia masih tidak dapat bersaing dengan kepesatan teknologi. Atas sebab ini, Bell Labs menulis egrep, yang bermaksud "grep lanjutan". Ini sangat meningkatkan kuasa ungkapan biasa.

3) POSIX (Antara Muka Sistem Pengoperasian Mudah Alih UNIX)

Antara Muka Sistem Pengoperasian Mudah Alih. Apabila grep berkembang, pembangun lain mencipta versi mereka sendiri dengan gaya unik berdasarkan pilihan mereka sendiri. Tetapi masalah juga timbul Sesetengah program menyokong metacharacter tertentu, sementara yang lain tidak. Oleh itu, POSIX. POSIX ialah satu set piawaian yang memastikan mudah alih antara sistem pengendalian. Walau bagaimanapun, POSIX, seperti SQL, belum menjadi standard terakhir dan hanya boleh digunakan sebagai rujukan.

4) Perl (Bahasa Pengekstrakan dan Pelaporan Praktikal)

Bahasa Pengekstrakan dan Pelaporan Praktikal. Pada tahun 1987, Larry Wall mengeluarkan Perl. Dalam 7 tahun berikutnya, daripada Perl1 kepada Perl5 semasa, ia akhirnya menjadi standard lain selepas POSIX.

5) PCRE

Kejayaan Perl telah menjadikan pembangun lain serasi dengan "Perl" sedikit sebanyak, termasuk C/C++, Java, Python, dll., yang kesemuanya mempunyai ungkapan biasa mereka sendiri. Pada tahun 1997, Philip Hazel membangunkan perpustakaan PCRE, iaitu satu set enjin ekspresi biasa yang serasi dengan ungkapan biasa Perl Pembangun lain boleh menyepadukan PCRE ke dalam bahasa mereka sendiri untuk menyediakan pengguna dengan fungsi ekspresi biasa yang kaya. PCRE digunakan oleh banyak perisian, termasuk PHP.

Peraturan sintaks ungkapan biasa

Sebelum menggunakan ungkapan biasa, kita mesti mempelajari sintaks ungkapan biasa terlebih dahulu. Unsur konstituen ungkapan biasa secara amnya termasuk aksara biasa, metakarakter, penentu kelayakan, mata utama, aksara bukan cetakan dan penggantian yang ditentukan.

1) Aksara biasa

Aksara biasa merangkumi semua aksara boleh cetak dan tidak boleh cetak yang tidak dinyatakan secara eksplisit sebagai aksara meta, termasuk semua huruf besar dan kecil, nombor, dan simbol tanda baca dan beberapa simbol. Ungkapan biasa yang paling mudah ialah satu aksara biasa yang digunakan untuk membandingkan rentetan carian. Sebagai contoh, ungkapan biasa aksara tunggal /A/ akan sentiasa sepadan dengan huruf A.

Anda juga boleh menggabungkan berbilang aksara tunggal untuk membentuk ungkapan yang lebih panjang Contohnya, ungkapan biasa /the/ akan sepadan dengan, di sana, yang lain dan di atas anjing malas dalam rentetan carian. Tidak perlu menggunakan mana-mana operator penggabungan, hanya masukkan aksara secara berturut-turut.

2) Metacharacters

Selain aksara biasa, ungkapan biasa juga boleh mengandungi "metacharacters". Metacharacter boleh dibahagikan kepada metacharacter single-character dan metacharacter multi-character. Contohnya, metacharacter d, yang sepadan dengan aksara angka.

Semua aksara meta aksara tunggal disenaraikan dalam jadual di bawah.

元字符 行为 示例
* 零次或多次匹配前面的字符或子表达式,等效于{0,} zo* 与 “z”和“zoo”匹配
+ 一次或多次匹配前面的字符或子表达式,等效于{1,} zo+ 与 “zo”和“zoo”匹配,但与“z”不匹配
? 零次或一次匹配前面的字符或子表达式,等效于{0,1}
当 ? 紧随任何其他限定符(*、+、?、{n}、{n,} 或 {n,m})之后时,匹配模式是非贪婪的。非贪婪模式匹配搜索到的、尽可能少的字符串,而默认的贪婪模式匹配搜索到的、尽可能多的字符串
zo? 与“z”和“zo”匹配,但与“zoo”不匹配
o+? 只与“oooo”中的单个“o”匹配,而 o+ 与所有“o”匹配
do(es)? 与“do”或“does”中的“do”匹配
^ 匹配搜索字符串开始的位置。如果标志中包括 m(多行搜索)字符,^ 还将匹配 n 或 r 后面的位置。如果将 ^ 用作括号表达式中的第一个字符,就会对字符集取反 ^d{3} 与搜索字符串开始处的 3 个字符匹配
[^abc] 与除 a、b、c 以外的任何字符匹配
$ 匹配搜索字符串结束的位置。如果标志中包括 m(多行搜索)字符,^ 还将匹配 n 或 r 前面的位置。 d{3}$ 与搜索字符串结尾处的 3 个数字匹配
. 匹配除换行符 n 之外的任何单个字符。若要匹配包括 n 在内的任意字符,请使用诸如 [sS] 之类的模式 a.c 与 “abc”“a1c”和“a-c”匹配
[] 标记括号表达式的开始和结尾 [1-4] 与“1”、“2”、“3”或“4”匹配
[^aAeEiIoOuU] 与任何非元音字符匹配
{} 标记限定符表达式的开始和结尾 a{2,3} 与“aa”和“aaa”匹配
() 标记子表达式的开始和结尾,可以保存子表达式,以备将来之用 A(d) 与“A0”至“A9”匹配。保存该数字以备将来之用
| 指示两个或多个项之间进行选择 z|food 与“z”或“food”匹配
(z|f)ood 与 “zood”或“food”匹配
/ 表示 JavaScript 中的文本正则表达式模式的开始和结尾。在第二个 “/”后添加单字符标志可以指定搜索行为 /abc/gi 是与 “abc”匹配的 JavaScript 文本正则表达式。g(全局)标志指定查找模式的所有匹配项,i(忽略大小写)标志使搜索不区分大小写
将下一字符标记为特殊字符、文本、反向引用或八进制转义符 n 与换行符匹配。( 与 “(”匹配。\ 与 “”匹配

Watak istimewa ini akan hilang makna apabila ia muncul dalam ungkapan kurungan dan menjadi watak biasa. Untuk memadankan watak istimewa ini, anda mesti melarikan diri terlebih dahulu dengan mendahuluinya dengan garis miring ke belakang. Sebagai contoh, untuk mencari aksara teks +, anda akan menggunakan ungkapan +.

Selain metakarakter tunggal aksara di atas, terdapat juga beberapa aksara meta berbilang aksara, seperti yang ditunjukkan dalam jadual di bawah.

Metacharacter Gelagat Contoh
b dengan perkataan Boundary sepadan. Iaitu, kedudukan antara perkataan dan ruang erb sepadan dengan "er" dalam "tidak pernah", tetapi tidak sepadan dengan "er" dalam "kata kerja"
B Padanan perkataan bukan sempadan erB sepadan dengan "er" dalam "kata kerja", tetapi bukan "er" dalam "tidak pernah"
d Padanan aksara nombor, bersamaan dengan [0-9] Dalam rentetan carian "12 345", d{2} sepadan dengan "12" dan "34" . d sepadan dengan "1", "2", "3", "4" dan "5"
D sepadan dengan aksara bukan angka, bersamaan dengan [ ^ 0-9] /D+ sepadan dengan "abc" dan "def" dalam "abc123 def"
w sepadan dengan A-Z, Padan dengan mana-mana watak dalam a-z, 0-9 dan garis bawah, bersamaan dengan [A-Za-z0-9] Dalam rentetan carian "Musang coklat cepat...", w+ adalah sama dengan " The", " padanan cepat", "coklat" dan "musang"
W sepadan dengan mana-mana aksara kecuali A-Z, a-z, 0-9 dan garis bawah , bersamaan dengan [^A- Za-z0-9] Dalam rentetan carian "Musang coklat cepat...", W+ sepadan dengan "..." dan semua ruang
[xyz ] set aksara, sepadan dengan mana-mana satu aksara yang dinyatakan [abc] dan sepadan dengan "a" dalam "plain"
[^ xyz] Set aksara songsang, sepadan dengan mana-mana aksara yang tidak dinyatakan [^abc] dengan "p", " 1", "i" dan "n" sepadan dengan
[a-z] julat aksara, padankan mana-mana aksara dalam julat yang ditentukan [a-z ] Padankan mana-mana aksara abjad huruf kecil dalam julat "a" hingga "z"
[^a-z] Julat aksara terbalik, dengan yang tidak dalam julat yang ditentukan Padan dengan mana-mana aksara [^a-z] sepadan dengan mana-mana aksara bukan dalam julat "a" hingga "z"
{n} tepat Padankan n kali, n ialah integer bukan negatif o{2} tidak sepadan dengan "o" dalam "Bob", tetapi sepadan dengan kedua-dua "o" dalam "fooood"
{n,} padanan sekurang-kurangnya n kali, n ialah integer bukan negatif
* sama dengan {0,}
+ sama dengan {1,}
o{2} tidak sepadan dengan "o" dalam " Bob", tetapi sepadan dengan semua "o" dalam "fooood"
{n,m} Padankan sekurang-kurangnya n kali dan paling banyak m masa. n dan m ialah integer bukan negatif, dengan n<= m, tidak boleh ada ruang antara koma dan nombor
Bersamaan dengan {0,1}
Dalam rentetan carian "1234567" , d{1 ,3} Padankan "123", "456" dan "7"
(corak) Memadankan corak dan menyimpan padanan. Padanan yang disimpan boleh diambil daripada elemen tatasusunan yang dikembalikan oleh Kaedah exec dalam JavaScript. Untuk memadankan aksara kurungan (), gunakan "(" atau ")" (Bab|Bahagian) [1-9] Padankan "Bab 5", simpan "Bab" untuk kegunaan masa hadapan
(?:pattern) sepadan dengan corak tetapi tidak menyimpan padanan, iaitu padanan tidak disimpan untuk kegunaan masa hadapan. Ini berguna apabila menggabungkan bahagian corak dengan aksara "atau" (|) industri(?:y|ies) adalah sama dengan industri|industri
(? =Mod) Ramalan positif diutamakan. Sebaik sahaja perlawanan ditemui, carian untuk perlawanan seterusnya bermula sebelum teks yang sepadan. Padanan tidak akan disimpan untuk kegunaan masa hadapan ^(?=_.*d.{4,8}$ Gunakan sekatan berikut pada kata laluan:
Ia mestilah antara 4 dan 8 aksara panjang antara dan mesti mengandungi sekurang-kurangnya satu digit, *d mencari sebarang bilangan aksara diikuti dengan digit, untuk rentetan carian "abc3qr", sepadan dengan "abc3" dari sebelum padanan itu dan bukannya selepas), {4,8} sepadan dengan rentetan mengandungi 4~8 aksara, sepadan dengan "abc3qr"
.^ dan $ tentukan kedudukan mula dan akhir rentetan carian, yang akan menghalang pemadanan jika rentetan carian mengandungi sebarang aksara selain daripada aksara yang sepadan
(?! corak) Ramalan negatif diutamakan. Memadankan rentetan carian yang tidak sepadan dengan corak. Sebaik sahaja perlawanan ditemui, carian untuk perlawanan seterusnya bermula sebelum teks yang sepadan. Padanan tidak disimpan untuk kegunaan masa hadapan b(?!th)/w+b sepadan dengan perkataan yang tidak bermula dengan "th" Dalam corak ini, b sepadan dengan sempadan perkataan. Untuk rentetan carian "cepat", sepadan dengan ruang pertama. (?!th) sepadan dengan rentetan bukan "th" padanan "qu", bermula dari padanan itu, !w+ sepadan dengan perkataan, iaitu padanan "cepat"
cx sepadan dengan aksara kawalan yang ditunjukkan oleh x. Nilai x mestilah dalam julat A-Z atau a-z. Jika tidak, c diandaikan sebagai aksara "c" itu sendiri cM sepadan dengan Ctrl+M atau pemulangan gerabak
xn Padanan n, dengan n ialah kod pelarian heksadesimal. Kod pelarian heksadesimal mestilah tepat dua digit panjang. Kod ASCII dibenarkan dalam ungkapan biasa x41 padanan "A", x41 bersamaan dengan "x04" diikuti dengan "1" (kerana n mestilah tepat dua digit)
num sepadan dengan num, dengan num ialah integer positif. Ini adalah rujukan kepada padanan yang disimpan dengan (.)1 sepadan dengan dua aksara serupa berturut-turut
n mengenal pasti kod Escape perlapanan atau rujukan belakang . Jika n didahului dengan sekurang-kurangnya n menangkap subungkapan, maka n ialah rujukan belakang, sebaliknya, jika n ialah nombor perlapanan (0-7), maka n ialah kod pelarian perlapanan (d)1 dan Padanan dua digit yang serupa berturut-turut
nm mengenal pasti kod pelarian oktal atau rujukan belakang. Jika nm didahului oleh sekurang-kurangnya nm menangkap subungkapan, maka nm ialah rujukan belakang. Jika nm didahului oleh sekurang-kurangnya n menangkap subungkapan, maka n ialah rujukan belakang diikuti oleh teks m. Jika tiada keadaan di atas wujud, apabila n dan m ialah digit perlapanan (0-7), nm sepadan dengan kod pelarian perlapanan nm 11 sepadan dengan aksara tab
nml Apabila n ialah nombor perlapanan (0-3), m dan 1 ialah nombor perlapanan (0-7), padankan kod pelarian perlapanan nml

另外,字符具有高于替换运算符的优先级,例如,允许 "m|food" 匹配 "m" 或 "food"。

替换

正则表达式中的替换允许对两个或多个替换选项之间的选择进行分组。实际上可以在模式中指定两种匹配模式的或关系。可以使用管道|字符指定两个或多个替换选项之间的选择,称之为“替换”。匹配管道字符任一侧最大的表达式。

例如:

/Chapter|Section [1-9][0-9]{0,1}/

该正则表达式匹配的是字符串“Chapter”或者字符串“Section”后跟一个或两个数字。

如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。但是,如果搜索字符串是“Chapter 22”,那么表达式匹配单词“Chapter”,而不是匹配“Chapter 22”。

为了解决这种形式的表达式可能带来的误导,可以使用括号来限制替换的范围,即确保它只应用于两个单词“Chapter”和“Section”。可以通过添加括号来使正则表达式匹配“Chapter 1”或“Section 3”。将以上表达式改成如下形式:

/(Chapter|Section) [1-9][0-9]{0,1}/

修改后,如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。如果搜索字符串是“Chapter 22”,那么表达式匹配单词也会是“Chapter 22”。

子表达式

正则表达式中放置括号可创建子表达式,子表达式允许匹配搜索文本中的模式并将匹配项分成多个单独的子匹配项,程序可检索生成的子匹配项。

例如匹配邮箱账号的正则表达式:

/(\w+)@(\w+)\.(\w+)/

该正则表达式包含 3 个子表达式,3 个子表达式分别进行匹配并保留匹配结果,与其他表达式匹配结果作为一个整体显示出来。

下面的示例将通用资源指示符(URI)分解为其组件:

/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/
  • 第一个括号子表达式保存 Web 地址的协议部分,匹配在冒号和两个正斜杠前面的任何单词。

  • 第二个括号子表达式保存地址的域地址部分,匹配不包括左斜线/或冒号:字符的任何字符序列。

  • 第三个括号子表达式保存网站端口号(如果指定了的话),匹配冒号后面的零个或多个数字。

  • 第四个括号子表达式保存 Web 地址指定的路径和/或页信息,匹配零个或多个数字字符#或空白字符之外的字符。

如果我们使用这个正则表达式匹配字符串“http://msdn.microsoft.com:80/scripting/default.htm”,那么 3 个子表达式的匹配结果分别为 http、msdn.microsoft.com:80、/scripting/default.htm。

反向引用

反向引用用于查找重复字符组。此外,可使用反向引用来重新排列输入字符串中各个元素的顺序和位置,以重新设置输入字符串的格式。

可以从正则表达式和替换字符串中引用子表达式。每个子表达式都由一个编号来标识,并称作反向引用。

在正则表达式中,每个保存的子匹配项按照它们从左到右出现的顺序存储。用于存储子匹配项的缓冲区编号从 1 开始,最多可存储 99 个子表达式。在正则表达式中,可以使用 \n 来访问每个缓冲区,其中 n 标识特定缓冲区的一位或两位十进制数字。

反向引用的一个应用是,提供查找文本中两个相同单词的匹配项的能力。以下面的句子为例:

Is is the cost of of gasoline going up up?

该句子包含多个重复的单词。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,就会很有用。

下面的正则表达式使用单个子表达式来实现这一点:

/\b([a-z]+) \1\b/

在此情况下,子表达式是括在括号中的所有内容。该子表达式包括由 [a-z]+ 指定的一个或多个字母字符。正则表达式的第二部分是对以前保存的子匹配项的引用,即单词的第二个匹配项正好由括号表达式匹配。\1 用于指定第一个子匹配项。\b 单词边界元字符确保只检测单独的单词。否则,诸如“is issued”或“this is”之类的词组将不能正确地被此表达式识别。所以,使用表达式 /\b([a-z]+)\1\b/ 匹配字符串“Is is the cost of of gasoline going up up?”得到的结果为 is、of、up。

在 PHP 中使用正则表达式

PHP 有两套函数库支持的正则表达式处理操作:

  • 一套是由 PCRE(Perl Compatible Regular Expression)库提供、与 Perl 语言兼容的正则表达式函数,以preg_为函数的前缀名称;

  • Set lain ialah POSIX (Antara Muka Sistem Pengendalian Mudah Alih) fungsi ekspresi biasa sintaks lanjutan, dengan ereg_ sebagai awalan fungsi.

Fungsi kedua-dua perpustakaan fungsi adalah serupa, tetapi kecekapan pelaksanaan PCRE lebih tinggi daripada POSIX, jadi kami hanya memperkenalkan perpustakaan fungsi PCRE.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Apakah maksud ungkapan biasa php?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn