0

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

我有一个巨大的 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

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

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

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

有没有办法用正则表达式做到这一点......就像

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

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

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

4

4 回答 4

2

描述

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

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

在此处输入图像描述

团体

组 0 获取从打开标签到关闭标签的整个 td 标签

  1. 获取围绕类值的打开引号,以确保也找到正确的关闭捕获
  2. 获取所需的文本

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
        )

)
于 2013-06-16T20:30:00.603 回答
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);
于 2013-06-16T20:34:14.857 回答
0

您可以使用 php DOMDocument

<?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/>';
     }
?>
于 2013-06-16T19:36:37.310 回答
0
/(<td colspan="2" align="center" class="thumimages"><b>)([a-z0-9]+)(</b></td></tr>)/i

这行得通。

于 2013-06-16T19:31:54.130 回答