2013-07-28 59 views
1

我有一個像這樣的preg_match有時

$data = '<a href="not important"><span class="theclass">data (not important)</span></a> <span class="anotherclass">extra data (October 1, 2010)</span>'; 

數據我想要得到的括號內的日期,以便香港專業教育學院做了以下的preg_match

preg_match("/\((([a-zA-Z]{5,10} .*?)|(\d{4}))\)/i",$data,$res); 

請勿有時'10月1日'不存在但是年總是存在因此OR條件....事情是它給了我在這種情況下數組3,我知道它是因爲我有3個大括號條件,有沒有其他更好,更乾淨的方式來實現這一目標?

第二個條件的方法

$data = <a href="not important"><span class="theclass">data</span></a> <span class="theother">data <a href="not importand">data</a> (2009)</span> 
     </h3> 

謝謝你們

+0

**不要使用正則表達式來解析HTML。使用合適的HTML解析模塊**您無法可靠地使用正則表達式解析HTML,並且您將面臨悲傷和挫折。只要HTML從你的期望改變,你的代碼就會被破壞。有關如何使用已經編寫,測試和調試的PHP模塊正確解析HTML的示例,請參閱http://htmlparsing.com/php。 –

+0

即使我用xpath dom我仍然需要一個類參考它可以得到的數據。這與preg_match完成的事情幾乎完全相同,在下面的preg之前,所以我不明白爲什麼人們反對它......這是其他人更輕量級? – Anup

回答

2

使用lookarounds

這裏,我們要確保有一個前(字符,接下來我們來看看文本,我們將看到像你的例子一樣格式化日期。這一小段代碼表示允許字母數字字符,一個字面空格字符和一個逗號,以及數字([A-Za-z ,\d]+)?+字符表示至少1。它不像.*.+那樣貪婪。我用圓括號將它包圍起來,然後加上一個?字符使其不是必需的。它的工作方式類似於您的|聲明,因爲它仍然會找到年份,但我們並沒有通過解析其他支票來讓PHP做更多的工作。然後我們找到年份(總是4位數字{4})。然後我們檢查確認它後面跟着一個文字)字符。在(?<=\()後面的外觀和展望(?=\))將會找到一個匹配,但它們不包含在匹配結果中,讓您的答案變得清晰。

由於preg_match()返回array()我們正在捕獲數組中的第一個元素。如果您在同一字符串中查找多個匹配項,則可以使用preg_match_all

$data = '<a href="not important"> 
    <span class="theclass">data (not important)</span></a> 
    <span class="anotherclass">extra data (October 1, 2010)</span> 
    <span class="anotherclass">extra data (2011)</span>'; 
$pattern = '!(?<=\()([A-Za-z ,\d]+)?[\d]{4}(?=\))!'; 
$res = preg_match_all($pattern,$data,$myDate); 

print_r($myDate[0]); 

輸出

Array 
(
    [0] => October 1, 2010 
    [1] => 2011 
) 

如果你只想找一個比賽你會改變的代碼如下:

$res = preg_match($pattern,$data,$myDate); 

echo($myDate[0]); 

輸出

October 1, 2010 

寫入模式的另一種方式就是這樣......我們刪除了括號(分組)和修飾符,後面跟着條件?,但保留了第一組。然後我們使用*來使其成爲條件。區別在於preg_match和preg_match_all,任何分組也存儲在數組中。由於這不是一個組,所以它不會存儲額外的數組元素。

$pattern = '!(?<=\()[A-Za-z ,\d]*[\d]{4}(?=\))!'; 
+0

我添加了一個額外的條件,即一直存在。你能解釋一下你的表情嗎?謝謝:) – Anup

+0

啊好吧,當日期和年份都存在時,但不僅僅是當年:) – Anup

+0

當日期和年份都存在時,您的代碼完美無缺,但不僅僅是年:)是preg_match能夠滿足我的條件:) – Anup