成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

php實(shí)戰(zhàn)正則表達(dá)式(二):提取html元素

ityouknow / 1219人閱讀

摘要:在閱讀這篇文章前最好把同系列文章實(shí)戰(zhàn)正則表達(dá)式一驗(yàn)證手機(jī)號(hào)先仔細(xì)閱讀一遍。但實(shí)際上這樣一個(gè)表達(dá)式是無(wú)法從上面的中提取第一個(gè)元素的這里主要的問(wèn)題是在默認(rèn)情況下點(diǎn)號(hào)字符無(wú)法匹配換行符。但是很遺憾,正則表達(dá)式中沒(méi)有排除型子表達(dá)式或者說(shuō)排除型分組。

這篇文章通過(guò)提取html元素介紹了正則表達(dá)式中模式修飾符貪婪匹配非貪婪匹配Unicode模式、環(huán)視等知識(shí)點(diǎn)。
在閱讀這篇文章前最好把同系列文章php實(shí)戰(zhàn)正則表達(dá)式(一):驗(yàn)證手機(jī)號(hào)先仔細(xì)閱讀一遍。

基本提取

有這樣一個(gè)表格

用戶名 職業(yè)
Kobe Bryant 籃球運(yùn)動(dòng)員
Jay Chou 歌手、詞曲創(chuàng)作人、制作人、演員、導(dǎo)演
Lionel Messi 足球運(yùn)動(dòng)員

它的源碼如下:

用戶名職業(yè)
Kobe Bryant籃球運(yùn)動(dòng)員
Jay Chou歌手、詞曲創(chuàng)作人、制作人、演員、導(dǎo)演
Lionel Messi足球運(yùn)動(dòng)員

現(xiàn)在要提取第一個(gè)元素。最簡(jiǎn)單的正則表達(dá)式應(yīng)該是這樣:

s+.*

其中

s是php實(shí)戰(zhàn)正則表達(dá)式(一):驗(yàn)證手機(jī)號(hào)介紹過(guò)的字符組簡(jiǎn)記法中的一個(gè),代表回車符、空格、制表符等空白字符

量詞+表示它所修飾的字符或字符組出現(xiàn)次數(shù)大于等于1

點(diǎn)號(hào)字符.在正則表達(dá)式中是一個(gè)特殊的元字符,它可以匹配“任意字符”

閉標(biāo)簽中的斜線/在php的正則表達(dá)式中是模式分隔符,所以需要轉(zhuǎn)義來(lái)表示斜線字符。

但實(shí)際上這樣一個(gè)表達(dá)式是無(wú)法從上面的中提取第一個(gè)元素的

這里主要的問(wèn)題是在默認(rèn)情況下點(diǎn)號(hào)字符.無(wú)法匹配換行符 。有兩個(gè)方法可以解決這個(gè)問(wèn)題:

使用模式修飾符s,正則表達(dá)式為/s+.*/s(?s)s+.*。模式修飾符s的作用就是讓點(diǎn)號(hào)字符.可以匹配換行符。

[sS][wW][dD]代替點(diǎn)號(hào)字符.來(lái)匹配所有字符,正則表達(dá)式為s+[sS]*

關(guān)于模式修飾符(Pattern Modifiers),這里需要詳細(xì)介紹一下(點(diǎn)擊這里查看php支持的所有模式修飾符)。模式修飾符可以改變正則表達(dá)式的一些默認(rèn)規(guī)則,常用的模式修飾符有i、s、U、u等,我們?cè)诤竺鏁?huì)用到它們中的一些,這里不展開(kāi)介紹每個(gè)模式修飾符的作用,后面用到了再具體介紹。這里主要對(duì)比一下/.../{modifier}與...(?{modifier})...兩種表示方法的區(qū)別。

.*/s(?s).*
模式修飾符 /.../{modifier} ...(?{modifier})...
示例 /
名稱(php手冊(cè)) 模式修飾符 模式內(nèi)修飾符
名稱(《正則指引》) 預(yù)定義常量 模式修飾符
作用范圍 整個(gè)正則表達(dá)式 不在分組(子表達(dá)式)中時(shí),對(duì)它后面的全部正則表達(dá)式起作用;如果在分組(子表達(dá)式)中,則對(duì)它分組中的剩余部分起作用。在沒(méi)有分組,且放在整個(gè)正則表達(dá)式最前面的時(shí)候相當(dāng)于/.../{modifier}
支持程度 支持所有模式修飾符 支持部分模式修飾符
其他編程語(yǔ)言 可能不支持 一般都支持

從上面的gif中可以看到提取的結(jié)果中有三個(gè)tr,而不是只有一個(gè)。這是因?yàn)檎齽t表達(dá)式中量詞默認(rèn)是貪婪匹配,在這里,.*會(huì)匹配一切字符,直到最后沒(méi)有字符再向前回溯,回溯到中的最后一個(gè)時(shí)與正則表達(dá)式中的相匹配,從而完成整個(gè)匹配過(guò)程,最后的結(jié)果也就是包含了三個(gè)

可以使用模式修飾符U指定整個(gè)正則表達(dá)式為非貪婪模式,也可以使用非貪婪匹配量詞指定某一個(gè)量詞為非貪婪模式:

指定整個(gè)正則表達(dá)式為非貪婪模式:

/s+.*/Us

(?Us)s+.*

非貪婪量詞:
/s+.*?/s

完整的貪婪量詞(匹配優(yōu)先量詞)與非貪婪量詞(忽略優(yōu)先量詞)見(jiàn)下表:

貪婪量詞 非貪婪量詞 限定次數(shù)
* *? 可能出現(xiàn),可能不出現(xiàn),出現(xiàn)次數(shù)沒(méi)有上限
+ +? 至少出現(xiàn)1次,沒(méi)有上限
? ?? 出現(xiàn)0次或1次
{m,n} {m,n}? 出現(xiàn)次數(shù)大于等于m,小于等于n
{m,} {m,}? 至少出現(xiàn)m次,沒(méi)有上限
{0,n} {0,n}? 出現(xiàn)0次-n次
提取包含指定內(nèi)容的行

假設(shè)我們想把表格中有關(guān)于運(yùn)動(dòng)員的記錄都提取出來(lái),我們可能會(huì)使用/.*運(yùn)動(dòng)員.*/s這樣的正則表達(dá)式。

這個(gè)表達(dá)式在Unicode編碼環(huán)境下可以匹配出結(jié)果,但是在GBK環(huán)境下就未必了。我們可以通過(guò)模式修飾符u來(lái)指定Unicode模式:

/.*運(yùn)動(dòng)員.*/us

在Unicode模式下,我們甚至可以使用碼值來(lái)代替漢字:

/.*x{8fd0}x{52a8}x{5458}.*/us

php正則中使用x{hex}的形式來(lái)表示Unicode字符的碼值,使用碼值的好處是可以結(jié)合字符組來(lái)表示一段范圍,如[x{4e00}-x{9fff}]表示匹配所有漢字字符。

上面的表達(dá)式可以匹配出結(jié)果,但是卻不正確。我們可以看到,它匹配了整個(gè)字符串的第一個(gè)到最后一個(gè)。
直覺(jué)上,我們是想正則表達(dá)式先去匹配“運(yùn)動(dòng)員”,然后向左尋找最近的一個(gè),向右尋找最近的一個(gè)。但事實(shí)上,正則表達(dá)式是從左往右匹配的,即從開(kāi)始尋找,整個(gè)正則表達(dá)式的匹配情況見(jiàn)下表(空白字符沒(méi)有顯示出來(lái))。

表達(dá)式 匹配值
/
.* 用戶名職業(yè)
Kobe Bryant籃球
運(yùn)動(dòng)員 運(yùn)動(dòng)員
.*
Jay Chou歌手、詞曲創(chuàng)作人、制作人、演員、導(dǎo)演
Lionel Messi足球運(yùn)動(dòng)員
/us

這里兩個(gè).*匹配到的字符都比預(yù)期要多。第二個(gè).*匹配字符比預(yù)期多的原因是正則表達(dá)式默認(rèn)是貪婪匹配模式,它會(huì)匹配剩余字符串中的每個(gè)字符,直到字符串的末尾,然后再向前回溯到最后一個(gè),可以通過(guò)指定非貪婪匹配模式來(lái)解決這個(gè)問(wèn)題。但是第一個(gè).*匹配字符比預(yù)期多是正?,F(xiàn)象,因?yàn)檎齽t表達(dá)式是從左向右匹配的,表達(dá)式中的匹配字符串中第一個(gè),后面的.*則匹配剩余的所有字符,直到字符串的末尾,然后再向前回溯到“運(yùn)動(dòng)員”。

我們先看看使用非貪婪匹配時(shí)的結(jié)果:

可以看到,第二個(gè).*匹配的字符已經(jīng)是我們想要的了。那么,對(duì)于第一個(gè).*匹配字符比預(yù)期多這個(gè)問(wèn)題怎么解決呢?

如果僅使用到目前為止我的文章中介紹的知識(shí),也是有方法可以解決的。我們可以先從左到右匹配出所有的行(...),方法是使用php中的preg_match_all函數(shù)結(jié)合非貪婪匹配模式;然后再遍歷每一行,過(guò)濾出其中包含“運(yùn)動(dòng)員”的行即可。

當(dāng)然,我們也可以通過(guò)純粹的正則表達(dá)式來(lái)解決這個(gè)問(wèn)題。如果有一定正則表達(dá)式使用經(jīng)驗(yàn)的朋友可能很容易聯(lián)想到排除型字符組,我們介紹過(guò)字符組[...],它表示在同一位置可能出現(xiàn)的字符。而排除型字符組則表示在同一位置不能出現(xiàn)的字符,它的形式是[^...],通過(guò)緊跟在開(kāi)方括號(hào)[后面的^來(lái)表示排除型字符組。例如,[^d]表示匹配的字符是除了數(shù)字以外的任意字符。
如果有排除型子表達(dá)式,類似于(^)*,我們只需要指定第一個(gè).*排除就行了。但是很遺憾,正則表達(dá)式中沒(méi)有排除型子表達(dá)式或者說(shuō)排除型分組。這種情況下,我們只能使用環(huán)視

/(.(?!))*運(yùn)動(dòng)員.*/Us

環(huán)視(look-around)不匹配任何字符,用來(lái)“停在原地,四處張望”。上面的表達(dá)式使用了否定順序環(huán)視,它的形式是(?!...)。具體對(duì)于(.(?!))*來(lái)分析,每當(dāng).匹配了一個(gè)字符后,就向右看看,如果當(dāng)前匹配字符的右邊沒(méi)有出現(xiàn)就匹配成功。

完整的環(huán)視有:

名字 記法 含義
肯定順序環(huán)視 (?=...) 向右看看,右邊出現(xiàn)了環(huán)視中的內(nèi)容才匹配
否定順序環(huán)視 (?!...) 向右看看,右邊不出現(xiàn)環(huán)視中的內(nèi)容才匹配
肯定逆序環(huán)視 (?<=...) 向左看看,左邊出現(xiàn)了環(huán)視中的內(nèi)容才匹配
否定逆序環(huán)視 (? 向左看看,左邊不出現(xiàn)環(huán)視中的內(nèi)容才匹配

由于上面的正則表達(dá)式有一個(gè)分組(子表達(dá)式),所以匹配的結(jié)果除了下標(biāo)0,還有下標(biāo)1,這里下標(biāo)1的結(jié)果其實(shí)沒(méi)有什么用,我們可以用之前介紹過(guò)的非捕獲分組

/(?:.(?!))*運(yùn)動(dòng)員.*/Us

我們的真正目的是提取所有包含“運(yùn)動(dòng)員”的行,而上面只提取了第一個(gè),所以需要將preg_match函數(shù)換成preg_match_all。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/21126.html

相關(guān)文章

  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---26、正則達(dá)式

    摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)高級(jí)用法下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)與正則表達(dá)式抓取貓眼電影排行本節(jié)我們看一下正則表達(dá)式的相關(guān)用法,正則表達(dá)式是處理字符串的強(qiáng)大的工具,它有自己特定的語(yǔ)法結(jié)構(gòu),有了它,實(shí)現(xiàn)字符串的檢索替換匹配驗(yàn)證都不在話下。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---25、requests:高級(jí)用法下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼...

    Pocher 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---28、解析庫(kù)的使用:XPath

    摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)與正則表達(dá)式抓取貓眼電影排行下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)解析庫(kù)的使用上一節(jié)我們實(shí)現(xiàn)了一個(gè)最基本的爬蟲(chóng),但提取頁(yè)面信息時(shí)我們使用的是正則表達(dá)式,用過(guò)之后我們會(huì)發(fā)現(xiàn)構(gòu)造一個(gè)正則表達(dá)式還是比較的繁瑣的,而且萬(wàn)一有一點(diǎn)地 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼電影排行下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---29、解析庫(kù)的使用:...

    abson 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---27、Requests與正則達(dá)式抓取貓眼電影排行

    摘要:所以我們?nèi)绻氆@取電影,只需要分開(kāi)請(qǐng)求次,而次的參數(shù)設(shè)置為,,,,即可,這樣我們獲取不同的頁(yè)面結(jié)果之后再用正則表達(dá)式提取出相關(guān)信息就可以得到的所有電影信息了。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)正則表達(dá)式下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)解析庫(kù)的使用 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---26、正則表達(dá)式下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---28、解析庫(kù)的使用:XPath 本節(jié)我們利用 Reque...

    SwordFly 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---29、解析庫(kù)的使用:BeautifulSoup

    摘要:解析器在解析的時(shí)候?qū)嶋H上是依賴于解析器的,它除了支持標(biāo)準(zhǔn)庫(kù)中的解析器,還支持一些第三方的解析器比如,下面我們對(duì)支持的解析器及它們的一些優(yōu)缺點(diǎn)做一個(gè)簡(jiǎn)單的對(duì)比。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---28、解析庫(kù)的使用:XPath下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---30、解析庫(kù)的使用:PyQuery 前面我們介紹了正則表達(dá)式的相關(guān)用法,但是一旦正則寫(xiě)的有問(wèn)題,可能得到的就...

    MockingBird 評(píng)論0 收藏0
  • python爬蟲(chóng)爬取pixiv圖片實(shí)戰(zhàn)詳解

      小編寫(xiě)這篇文章的主要目的,是來(lái)給大家做出一個(gè)介紹,介紹關(guān)于python爬蟲(chóng)的一些技能技巧,包括怎么才能夠爬取pixiv圖片,作為一個(gè)小白來(lái)講,還是需要一定的實(shí)戰(zhàn)的,那么,具體的實(shí)戰(zhàn)技能,下面就給大家詳細(xì)的解答下?! ∽詮慕佑|python以后就想著爬pixiv,之前因?yàn)樘葑佑悬c(diǎn)問(wèn)題就一直擱置,最近換了個(gè)梯子就迫不及待試了下?! ∨老x(chóng)無(wú)非request獲取html頁(yè)面然后用正則表達(dá)式或者beaut...

    89542767 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

ityouknow

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<