2012-01-22 115 views
0

當人們詢問如何從網頁內容/文本等中獲取並提取圖像實際URL時,我看到了很多答案,但是,在我的數據庫中,不幸的是,我有這個語法:php匹配模式從文本文件中獲取圖像

<img class="photo" src="http://domain.com/image.jpg" alt="alt goes here" /> 

因此,典型的方式$pattern = '/src=["|\']([^"|\']+)/is';不會在我的情況,由於那些"工作... 一直在嘗試了幾個小時,我必須做一些非常非常錯誤的... 任何幫助非常感激!

+0

你爲什麼不先'str_replace'所有這一切,然後用你的正則表達式? –

+0

因爲'str_replace'不安全? **爲什麼即使在PHP中編寫HTML解碼器和解析器時,也只是通過調用正確的函數來實現它而已?** – Christian

+0

@ChristianSciberras - 看起來像您誤解了我:我說他應該[首先運行'str_replace'他的字符串](http://codepad.org/QekMM6IG),然後使用他的正則表達式! –

回答

1

不要使用正則表達式!

使用XML/DOM庫,如Simple HTML DOM

順便說一句,你正在尋找的正則表達式,

$pattern = '/src=(["\'])(.+)(?=\1)/i'; 

測試用例(可選):

下面是一個簡單的程序進行測試。顯然,您首先需要使用htmlspecialchars_decode()來從實體格式對其進行解碼。

$str = array(
    "<script type=\"text/javascript\" src=\"script.js\"></script>", 
    "<script type=\"text/javascript\" src='script.js'></script>", 
    '<script type="text/javascript" src="script.js"></script>', 
    '<script type="text/javascript" src=\'script.js\'></script>', 
); 
$pattern = '/src=(["\'])(.+)(?=\1)/i'; 

foreach($str as $s){ 
    preg_match($pattern, $s, $m); 
    echo $m[2], PHP_EOL; 
} 

輸出

script.js 
script.js 
script.js 
script.js 
+0

@mario我明白了,我的錯誤。認爲這是另一個正則表達式fanboyism的例子。 – Christian

+0

Okie。根據OP更新問題。 @mario。 –

+0

謝謝所有人,我遵循你對htmlspecialchars_decode的建議,最後我有有效的圖像URLS! 'if(preg_match($ pattern2,htmlspecialchars_decode($ ck ['post']),$ found_img))' – Andrew

0

你可以在這裏測試正則表達式:

http://gskinner.com/RegExr/

什麼是不工作?

+0

首先,雙引號轉換爲'"',就像其他特殊字符一樣,其次,'preg_match' *絕對不是這裏的解決方案*。 – Christian

+0

@ChristianSciberras,好的,我沒有看到原始文章中的編碼。很好的答案! – mowwwalker

2

首先,'常用的方法'是使用HTML/XML解析器,而不是正則表達式。

其次,你有什麼是編碼爲HTML文本,它聞起來很糟糕的原因有兩個HTML代碼:

  • 它不是HTML更多(爲什麼它編碼的HTML文本時,它實際上是在HTML代碼) ?
  • 在將代碼寫入數據庫之前,不應對HTML進行編碼,而應將其寫入用戶。

帶着這兩個問題放在一邊,你需要做的是htmlspecialchars_decode()的東西,並使之通過HTML解析器:

$stuff = '&lt;img class=&quot;photo&quot; src=&quot;http://domain.com/image.jpg&quot; alt=&quot;alt goes here&quot; /&gt;'; 
$code = htmlspecialchars_decode($stuff, ENT_QUOTES); 
$xml = simplexml_load_string($code); 

這就是說,對我來說這聽起來像一個黑客修復嚴重書面代碼。但首先它可能有一個合理的原因。

+0

' '< IMG類= "相片" SRC = " http://domain.com/image.jpg " ALT = " ALT到這裏"/>';'是僞樣品的方式來顯示千個不同的網址被發現在我的數據庫中。我的問題是孤立的實際圖像的位置,每次 – Andrew

+0

@Andrew我的觀點是,你在你的數據庫中的東西沒有做到正確。首先,不要將HTML編碼爲HTML文本,其次,當數據分成列和表而不是數據斑點時,數據庫的效果最好。儘管如此,你可以使用我的代碼來完成你想要的任務。 – Christian

+0

非常感謝大家的建議,@Christian Sciberras感謝你,它不是我的代碼,我不是一個大師,只是一個新手試圖修復一些買不到的東西...... Blame Invision IPB爲這種類型的db內容,所有這些都發生在授權用戶發佈html(允許直接在帖子中發佈html)的情況下發生。我有這樣的情況,就像那樣,不能改變它。必須處理它,並找到能夠識別圖像URL的正則表達式:) – Andrew