使用正则表达式从HTML表中查找结果

时间:2013-06-16 19:25:52

标签: php regex html-parsing

我遇到了一些正则表达式问题。

我在html中有一个巨大的文件,我需要从文件中提取一些文本(型号)。

<table>......
<td colspan="2" align="center" class="thumimages"><b>SK10014</b></td></tr> 
.......

<table>/.....
<td colspan="2" align="center" class="thumimages"><b>SK1998</b></td></tr> 

.... so on

这是一个巨大的页面,所有网页都建在表格中,并且没有......

“thumimages”类几乎在所有td中重复出现,因此无法区分页面中的要求内容。

大约有10000型号,我需要提取它们。

有没有办法用regrex做这个...比如

"/<td colspan="2" align="center" class="thumimages"><b>{[1-9]}</b></td></tr>/"

并返回所有匹配结果的数组。注意我已经尝试过HTML解析,但该文档包含许多html验证错误。

任何帮助将不胜感激......

4 个答案:

答案 0 :(得分:2)

描述

这会将所有td字段与class="thumimages"匹配,并检索内部b标记的内容。内部文本需要有一些值,任何前导或尾随空格都将被删除。

<td\b(?=\s)(?=[^>]*\s\bclass=(["'])thumimages\1)[^>]*><b>\s*(?!<)([^<\s]+)\s*<\/b><\/td>

enter image description here

组0从打开标记获取整个td标记以关闭标记

  1. 获取类值周围的开放引号,以确保找到正确的结束捕获
  2. 获取所需的文字
  3. PHP代码示例:

    输入文字

    <table>......
    <td colspan="2" align="center" class="thumimages"><b>SK10014</b></td></tr> 
    .......
    <table>/.....
    <td colspan="2" align="center" class="thumimages"><b>     </b></td></tr> 
    
    
    <table>/.....
    <td colspan="2" align="center" class="thumimages"><b>   SK1998    </b></td></tr> 
    

    代码

    <?php
    $sourcestring="your source string";
    preg_match_all('/<td\b(?=\s)(?=[^>]*\s\bclass=(["'])thumimages\1)[^>]*><b>\s*(?!<)([^<\s]+)\s*<\/b><\/td>/imsx',$sourcestring,$matches);
    echo "<pre>".print_r($matches,true);
    ?>
    

    匹配

    $matches Array:
    (
        [0] => Array
            (
                [0] => <td colspan="2" align="center" class="thumimages"><b>SK10014</b></td>
                [1] => <td colspan="2" align="center" class="thumimages"><b>   SK1998    </b></td>
            )
    
        [1] => Array
            (
                [0] => "
                [1] => "
            )
    
        [2] => Array
            (
                [0] => SK10014
                [1] => SK1998
            )
    
    )
    

答案 1 :(得分:1)

使用DOMDocument的方法:

// $html stands for your html content
$doc = new DOMDocument();
@$doc->loadHTML($html);
$td_nodes = $doc->getElementsByTagName('td');

foreach($td_nodes as $td_node){
    if ($td_node->getAttribute('class')=='thumimages')
        echo $td_node->firstChild->textContent.'<br/>';
 }

使用正则表达式的方法:

$pattern = <<<'LOD'
~
<td (?>[^>c]++|\bc(?!lass\b))+ # begining of td tag until the word "class" 
class \s*+ = \s*+              # "class=" with variable spaces around the "="
(["']?+) thumimages\b \1       # "thumimages" between quotes or not 
(?>[^>]++|(?<!b)>)+>           # all characters until the ">" from "<b>"
\s*+  \K                       # any spaces and pattern reset

[^<\s]++                    # all chars that are not a "<" or a space
~xi
LOD;

preg_match_all($pattern, $html, $matches);

echo '<pre>' . print_r($matches[0], true);

答案 2 :(得分:0)

/(<td colspan="2" align="center" class="thumimages"><b>)([a-z0-9]+)(</b></td></tr>)/i

这很有效。

答案 3 :(得分:0)

您可以使用php DOMDocument Class

<?php
    $dom = new DOMDocument();
    @$dom->loadHTMLFile('load.html');
    $xpath = new DOMXPath($dom);

     foreach($xpath->query('//tr') as $tr){
        echo $xpath->query('.//td[@class="thumimages"]', $tr)->item(0)->nodeValue.'<br/>';
     }
?>