我想這(特別是名字)相匹配:我的正則表達式不知道什麼時候停止
<tr>
<th class="name">Name:</th>
<td>John Smith</td>
</tr>
像這樣:
preg_match('/<th class="name">Name:<\/th>.+?<td>(.+)<\/td>/s', $a, $b);
然而,雖然它匹配名稱,它不會停在名稱的末尾。它繼續保持另外150個字符。爲什麼是這樣?我只想匹配這個名字。
我想這(特別是名字)相匹配:我的正則表達式不知道什麼時候停止
<tr>
<th class="name">Name:</th>
<td>John Smith</td>
</tr>
像這樣:
preg_match('/<th class="name">Name:<\/th>.+?<td>(.+)<\/td>/s', $a, $b);
然而,雖然它匹配名稱,它不會停在名稱的末尾。它繼續保持另外150個字符。爲什麼是這樣?我只想匹配這個名字。
做最後量詞非貪婪:preg_match('/<th class="name">Name:<\/th>.+?<td>(.+?)<\/td>/s', $a, $b);
感謝您的工作。 – 2013-02-12 06:39:55
不使用正則表達式來解析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
)
*/
?>
preg_match('/<th class="name">Name:<\/th>\s*<td>(.+?)<\/td>/s', $line, $matches);
僅匹配</th>
和<td>
,與非之間的空白 - 名稱匹配。
preg_match('/<th class="name">Name:<\/th>.+?<td>(?P<name>.*)<\/td>/s', $str, $match);
echo $match['name'];
這裏是你的對手
preg_match(!<tr>\s*<th[^>]*>Name:</th>\s*<td>([^<]*)</td>\s*</tr>!s)
它會很好地工作。
請使用HTML解析器!無論如何,修正:'(。+)' - >'(。+?)' – nhahtdh 2013-02-12 06:37:59
@nhahtdh:太晚了! – 2013-02-12 06:38:39
將'(。+)'替換爲'([^ <] +)' – vlcekmi3 2013-02-12 06:38:39