正则表达式-PHP预匹配

正则表达式-PHP预匹配,php,regex,Php,Regex,我正在学习使用正则表达式,并想从表中获取一些数据: 该文件如下所示: $subject = <tbody> <tr> <td>1</td> <td>2</td> <td>3</td> </tr> <tr>

我正在学习使用正则表达式,并想从表中获取一些数据:

该文件如下所示:

$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 = "/<td>([0-9]{1,2})<\/td>/s";
$pattern=“/([0-9]{1,2})/s”;
然而,这只抓住了第一个数字:1


最好的方法是什么?

您应该使用preg\u match\u all而不是preg\u match对整个变量执行搜索


您应该使用preg_match_all而不是preg_match对整个变量执行搜索


要获取所有值并且在第一次匹配后不停止,需要使用g标志

在php中,这是在preg_match_all函数中实现的

由于数据始终包含在td中,您可以执行以下操作:

$pattern = "/<tr>.*?<td><\/td>.*?<td>(.*?)<\/td>.../s";
preg_match_all("/<td>(.*)<\/td>", $subject, $matches);
var_dump($matches);
preg_match_all(“/(.*)”,$subject,$matches);
var_dump($matches);

其中$subject包含html,您应该看到所有表数据的数组

要获取所有值并且在第一次匹配后不停止,需要使用g标志

在php中,这是在preg_match_all函数中实现的

由于数据始终包含在td中,您可以执行以下操作:

$pattern = "/<tr>.*?<td><\/td>.*?<td>(.*?)<\/td>.../s";
preg_match_all("/<td>(.*)<\/td>", $subject, $matches);
var_dump($matches);
preg_match_all(“/(.*)”,$subject,$matches);
var_dump($matches);

其中$subject包含html,您应该看到所有表数据的数组

这里有一种使用解析器来实现这一点的方法:

$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"; 
    }
}

下面是一种使用解析器实现此目的的方法:

$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"; 
    }
}


你的意思是你想要
g
标志?…我不确定,这是我第一次使用正则表达式。
s
修饰符对你当前的正则表达式也没有影响,因为你没有
。你的意思是你想要
g
标志?…我不确定,这是我第一次使用正则表达式。
s
修饰符对您当前的正则表达式也没有影响,因为其中没有
。哦,这可能会起作用。有没有可能给它添加AND运算符?你是什么意思?您想做什么?我想首先从表中匹配给定的模式:。。然后在那之后拉一些静态数据:数据然后抓取一些进一步的模式。。。还是最好在单独的查询中执行此操作?为了使代码更清晰,我建议在单独的查询中执行此操作,这取决于regexOh的复杂性,这可能会起作用。有没有可能给它添加AND运算符?你是什么意思?您想做什么?我想首先从表中匹配给定的模式:。。然后在那之后拉一些静态数据:数据然后抓取一些进一步的模式。。。还是最好在单独的查询中执行此操作?为了使代码更清晰,我建议在单独的查询中执行此操作,这取决于regext的复杂性。此操作看起来很有趣,实际上可能适合我的需要。我只是尝试了一下,如果HTML中有一个无效的标记,我看到它就死了。。。有办法解决这个问题吗?它不应该死,它应该只是抛出警告,如果你取消注释那里的两行,你会看到错误消失。你能推荐这方面的文档吗?我想了解我还可以做什么。PHP网站做。这里也有一篇关于它的文章,这看起来很有趣,可能真的适合我的需要。我只是尝试了一下,如果HTML中有一个无效的标记,我看到它就死了。。。有办法解决这个问题吗?它不应该死,它应该只是抛出警告,如果你取消注释那里的两行,你会看到错误消失。你能推荐这方面的文档吗?我想了解我还可以做什么。PHP网站做。这上面还有一篇文章,