我遇到了一些正则表达式问题。
我在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验证错误。
任何帮助将不胜感激......
答案 0 :(得分:2)
这会将所有td
字段与class="thumimages"
匹配,并检索内部b
标记的内容。内部文本需要有一些值,任何前导或尾随空格都将被删除。
<td\b(?=\s)(?=[^>]*\s\bclass=(["'])thumimages\1)[^>]*><b>\s*(?!<)([^<\s]+)\s*<\/b><\/td>
组0从打开标记获取整个td标记以关闭标记
输入文字
<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/>';
}
?>