我正在学习使用正则表达式,并希望从表中获取一些数据:
文件如下:
$subject =
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
</tbody>
目前我正在做以下工作:
$pattern = "/<tr>.*?<td><'/td>.*?<td>(.*?)<'/td>.../s";
预匹配(_M)($模式,$主题,$result);
这将输出一个数组:
$result = [
0 => "tbody>...",
1 => 1,
2 => 2,
3 => 3,
4 => 4 ... n
]
这似乎效率低下,所以我试图抓住一个重复的模式,比如:
$pattern = "/<td>([0-9]{1,2})<'/td>/s";
然而,这只抓住了第一个数字:1
对此,最好的方法是什么?
您应该使用preg_match_all而不是preg_match来对整个var 执行搜索
http://php.net/manual/en/function.preg-match-all.php
if (preg_match_all( $pattern, $subject, $matches)) {
var_dump($matches);
}
以下是使用解析器实现这一点的方法:
$subject = '
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
</tbody>';
$html = new DOMDocument();
$html->loadHTML($subject);
$tds = $html->getElementsByTagName('td');
foreach($tds as $td){
echo $td->nodeValue . "'n";
if(is_numeric($td->nodeValue)) {
echo "it's a number 'n";
}
}
输出:
1
it's a number
2
it's a number
3
it's a number
4
it's a number
5
it's a number
6
it's a number
要获得所有值并且在第一次匹配后不停止,需要使用g标志。
在php中,这是在preg_match_all函数中实现的。
由于数据总是包含在td中,您可以执行以下操作:
preg_match_all("/<td>(.*)<'/td>", $subject, $matches);
var_dump($matches);
在$subject包含html的地方,您应该看到所有表数据的数组。