2012-01-22 142 views
23

多行模式如何能夠匹配通過PHP的preg_match正則表達式模式主題這個HTML代碼:匹配通過PHP的preg_match

 <table border=0> 
    <tr> 
    <td> 


    <h2>subject</h2> 



    </td> 

所有的空格和換行,留下的目的。所以問題是使用一些多線模式提取主題名稱?

回答

2

很簡單地用

preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches); 
print($matches[1]); 

,除非你需要匹配跨多行字符串的多行格式對正則表達式沒有任何影響。

+0

對不起,我本來應該更具體。問題在於我正在處理的HTML代碼中缺少「標識符」。可以有一些其他的h2標籤和其他。所以我試圖使用周圍的標籤來精確定位代碼中的這個特定位置。那麼我怎樣才能讓正則表達式模式理解多線?... –

45

如果你正在尋找(比如)一個h2標籤內一個td標籤那裏只有兩個之間的空白嵌套,只需使用\s其中包括空格,換行,等等。例如::

preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches); 
// result is in $matches[1] 

看到它在行動here

爲了您的興趣,here是您可以傳遞給preg_*函數的不同修飾符的列表。您可能會感興趣的標記是:

  • s( 「DOTALL」):這個人讓.每一個字符匹配,包括換行。所以,說你的<h2>.....</h2>分散在多行。然後,你必須做

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches); 
    

    爲了有.*去多行(見額外s在正則表達式的結束?)。

  • m(「多」):這一個只是讓,而不是僅僅是開始/ 末的^$比賽的開始/結束。如果您在模式中使用^$,並且希望它們匹配輸入中每個單獨行的開始/結尾,則只需要它。
+1

男人......我被困了1.5小時,直到找到你的帖子。謝謝! 「s」屬性就是我一直在尋找的。 – codemonkey613

+0

我想要匹配多行輸入中特定行的開始,所以''/^start/im'' –

10

您可以將m經營者添加到您的正則表達式:

// Given your HTML content. 
$html = 'Your HTML content'; 
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches); 

希望這(仍)幫助,哈哈哈。

+3

我認爲's'修飾符(對於「DOTALL」或「單行」模式)是你在想什麼,這已經[建議](http://stackoverflow.com/a/8959000/20938)。 –

+0

這哈哈哈很不安。 – Ch3shire

-2

您必須在正則表達式中使用\s刪除所有換行符。

$str ="<ol> 
     <li>Capable for unlimited product</li> 
     <li>Two currency support</li> 
     <li>Works with touch screens and click screen based systems</li> 
     <li>Responsive design <b>shopping cart</b>, Specially design for Mac, iPhone, iPad, PC and Android</li> 
     <li>VAT for countries that support a Value Added Tax</li> 
     <li>Barcode scanner checkout option for POS</li> 
     <li>mRSS</li> 
     </ol>"; 

preg_match("/^([A-Za-z0-9\s\<\>\.\,\/\-\ ]+)$/",$str); 

//Sanitize your code before save to database. 

function test_input($data) { 
$data = trim($data); 
$data = htmlspecialchars($data); 
$data = json_encode($data); 
$data = addslashes($data); 
return $data; 
} 

echo test_input($str); 
+0

我認爲他想保留新行 –

0

你不應該使用正則表達式來解析HTML。如果您無法控制用戶可輸入的內容,它可能會導致很多問題。每種語言都有很多更好的解決方案。在大多數情況下,XML解析器做得更好。退房DOMDocumentsimplehtmldomphp-html-parser

在這裏看到更多的答案,爲什麼你不應該在HTML中使用正則表達式: RegEx match open tags except XHTML self-contained tags

+0

我正在尋找這個答案。我很驚訝,5年後沒有人提出,用正則表達式解析html也許是個好主意。不明白爲什麼它是downvoted。 – s3v3n

+0

是的,歡迎來到俱樂部。我仍然支持我的回答,雖然:) –

+0

這絕對是解決這個問題的方法。至少給它另一個upvote :-) – Marty