2

我正在尝试使用 preg_match 获取包含 html 标记的第一个表,但它在这里不起作用是我正在尝试的

 $con='<table class="first">
 <tr><td>31231</td></tr>
 <tr><td>25235</td></tr>
 </table>


<table class="second">
<tr><td>333</td></tr>
<tr><td>333</td></tr>
</table>';

preg_match('/<table class="first">[^~]+<\/table>/i',$con,$match);//It's also includes second table
preg_match('/<table class="first">[^~]+?<\/table>/i',$con,$match);//Not matching anything..

请帮助...... PS:我不想使用DOM或其​​他方法......只有正则表达式。

4

4 回答 4

2

为什么第一个表达式也匹配第二个表是preg_match默认情况下是“贪婪”的。这意味着如果您正在寻找<table>(.*)</table>它,它将获得从第一个匹配<table>到最后一个匹配之间的所有内容</table>您可以通过添加U修饰符使其“不贪婪” 。

preg_match('/<table class="first">[^~]+<\/table>/iU',$con,$match);

当使用“不贪婪”修饰符时,它将在第一个匹配时停止</table>

您可以使用多种模式修饰符。

于 2013-07-03T10:06:07.917 回答
1

如果你要穿越阿尔卑斯山,你会使用哪一个?

菜刀 路虎揽胜

正则表达式几乎总是用于修改 HTML 的错误工具。这是个坏主意。您想知道如何使用正则表达式来修改 HTML?答案是:不要。如题,算了。别管它。去度假。你是个聪明人:做点别的

在这种情况下,您应该做的是使用 DOM 方法,由旨在执行此任务的内置 PHP 库提供。

$dom = new DOMDocument;
$dom->loadHTML($yourHTML);
$xpath = new DOMXPath($dom);

$table = $xpath->query('//table[@class="first"]');
于 2013-07-03T10:36:50.790 回答
1

尝试这个

preg_match('/<table class="first">.+?<\/table>/is',$con,$match);
于 2013-07-03T10:04:21.337 回答
0

第二个正在工作,

$con='<table class="first">
 <tr><td>31231</td></tr>
 <tr><td>25235</td></tr>
 </table>


<table class="second">
<tr><td>333</td></tr>
<tr><td>333</td></tr>
</table>';

preg_match('/<table class="first">[^~]+?<\/table>/i',$con,$match2);
print_r($match2);

在http://writecodeonline.com/php/上测试

于 2013-07-03T10:05:04.653 回答