2016-11-09 103 views
-1

我正在清理並將內容遷移到新網站。在一些現有頁面中,嵌入圖像鏈接到非標準文件夾中的文件。爲什麼我的preg_match_all語句捕獲比它應該更多?

我拉數據庫中的記錄,然後做一個「preg_match_all」來捕獲違規項目。然後我的意圖是清理文件名,移動違規文件,然後更新數據庫條目以反映新位置。

但是,由於某種原因,我的正則表達式似乎只發現一個匹配(已知的多個潛在命中),有時似乎捕獲了我想要的字符串下游的其他東西的整個負載。

這是我使用的表達模式:

(?i)(<img.*src="uploads/RTEmagicC_(.*)")/ 

這是我對匹配的來自數據庫的內容的示例:

BLAH BLAH BLAH<img src="uploads/RTEmagicC_Herpes_simpex_virus.jpg.jpg" alt="HSV particles" style="FLOAT: left; WIDTH: 214px; HEIGHT: 198px" title="Electron micrograph of HSV particles©NASA">blah blah blah<img src="uploads/RTEmagicC_Herpes_labialis_01.jpg.jpg" alt="Coldsore" style="FLOAT: right;" title="Cold sore on the lower lip (cluster of fluid-filled blisters = very infectious). These infections may appear on the lips, nose or in surrounding areas.©Metju12" width="238" height="178">blah blah blah 

我試圖抓住: "Herpes_simpex_virus.jpg.jpg""Herpes_labialis_01.jpg.jpg"和各自的完整鏈接例如: "img src="uploads/RTEmagicC_Herpes_simpex_virus.jpg.jpg"

但它也匹配一堆下游內容,超出了關閉文件名的"

有人能讓我擺脫我的痛苦嗎?我已經嘗試了幾個晚上在這個,顯然我正在做一些愚蠢的事情,但我不明白...

非常感謝。

+1

不要使用正則表達式來解析HTML,請使用像DOMDocument這樣的HTML解析器。 – Barmar

+0

謝謝;但我必須承認,我不知道如何做到這一點或不使用正則表達式背後的理由。你能解釋一下,還是請給我一個參考?謝謝 – Chris

+0

看到http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Barmar

回答

-1

默認情況下,正則表達式是貪婪匹配的,所以.*儘可能匹配,包括其他"直到最後"它可以找到。在img之後使用.*也是如此。你可以使用延遲匹配,儘可能少匹配,爲你的量詞增加一個?,所以在你的情況下,這將是(?i)<img.*?src="uploads/RTEmagicC_(.*?)"

對於您的測試字符串,您不需要.*?,簡單的\s+(匹配一個或多個空格字符)就足夠了 - 但這可能不適用於所有數據。您也可以用[^"]*替換第二個.*?,匹配任意數量的非引號。

+0

非常感謝您;但是,我現在沒有捕獲RTEmagicC_位的下游文件名。這是什麼出來: 0 =>'HSV particles' Chris

+0

你是什麼意思? https://regex101.com/r/gubOWj/1 –

+0

道歉 - 它發佈之前,我有機會完成打字。 – Chris

相關問題