2013-02-12 83 views
1

我想這(特別是名字)相匹配:我的正則表達式不知道什麼時候停止

<tr> 
    <th class="name">Name:</th> 
    <td>John Smith</td> 
</tr> 

像這樣:

preg_match('/<th class="name">Name:<\/th>.+?<td>(.+)<\/td>/s', $a, $b); 

然而,雖然它匹配名稱,它不會停在名稱的末尾。它繼續保持另外150個字符。爲什麼是這樣?我只想匹配這個名字。

+0

請使用HTML解析器!無論如何,修正:'(。+)' - >'(。+?)' – nhahtdh 2013-02-12 06:37:59

+0

@nhahtdh:太晚了! – 2013-02-12 06:38:39

+0

將'(。+)'替換爲'([^ <] +)' – vlcekmi3 2013-02-12 06:38:39

回答

3

做最後量詞非貪婪:preg_match('/<th class="name">Name:<\/th>.+?<td>(.+?)<\/td>/s', $a, $b);

+0

感謝您的工作。 – 2013-02-12 06:39:55

0

不使用正則表達式來解析HTML,它很容易與DOM文檔:

<?php 
$html = <<<HTML 
<tr> 
    <th class="name">Name:</th> 
    <td>John Smith</td> 
</tr> 
<tr> 
    <th class="name">Somthing:</th> 
    <td>Foobar</td> 
</tr> 
HTML; 

$dom = new DOMDocument(); 
@$dom->loadHTML($html); 

$ret = array(); 
foreach($dom->getElementsByTagName('tr') as $tr) { 
    $ret[trim($tr->getElementsByTagName('th')->item(0)->nodeValue,':')] = $tr->getElementsByTagName('td')->item(0)->nodeValue; 
} 

print_r($ret); 
/* 
Array 
(
    [Name] => John Smith 
    [Somthing] => Foobar 
) 
*/ 
?> 
0
preg_match('/<th class="name">Name:<\/th>\s*<td>(.+?)<\/td>/s', $line, $matches); 

僅匹配</th><td>,與非之間的空白 - 名稱匹配。

0
preg_match('/<th class="name">Name:<\/th>.+?<td>(?P<name>.*)<\/td>/s', $str, $match); 

echo $match['name']; 
0

這裏是你的對手

preg_match(!<tr>\s*<th[^>]*>Name:</th>\s*<td>([^<]*)</td>\s*</tr>!s) 

它會很好地工作。

相關問題