我的英语不好。
我正在尝试在preg_match中进行preg_match!
我明白了:
if( preg_match_all('~<td class="fluctuation">\s*(.*?)\s*</td>~si', $input, $item_updown_select ) );
如果我var_dump它,我明白了:
array(2) {
[0]=>
array(32) {
[0]=>
string(153) "<td class="fluctuation">
<span class="down"><span class="icon"></span>13.31%</span>
</td>"
[1]=>
string(150) "<td class="fluctuation">
<span class="up"><span class="icon"></span>3.45%</span>
</td>"
[2]=>
string(150) "<td class="fluctuation">
<span class="up"><span class="icon"></span>4.56%</span>
</td>"
[3]=>
string(151) "<td class="fluctuation">
<span class="up"><span class="icon"></span>10.07%</span>
</td>"
}
[1]=>
array(32) {
[0]=>
string(58) "<span class="down"><span class="icon"></span>13.31%</span>"
[1]=>
string(55) "<span class="up"><span class="icon"></span>3.45%</span>"
[2]=>
string(55) "<span class="up"><span class="icon"></span>4.56%</span>"
[3]=>
string(56) "<span class="up"><span class="icon"></span>10.07%</span>"
}
}
现在我想从这个数组只有这个类!
如果我这样做,我知道它有效:
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][0], $item_updown0 ) );
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][1], $item_updown1 ) );
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][2], $item_updown2 ) );
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $item_updown_select[1][3], $item_updown3 ) );
但是,如果我有超过3项,那就是编码错误!
你知道更好的方法吗?
我现在谷歌约8个小时,并没有想到。
我已经尝试过foreach:
foreach($item_updown_select[1] as $index => $text_to_draw) {
if( preg_match_all('~<span class="\s*(.*?)\s*"><span class~si', $text_to_draw, $item_updown ) );
print_r( $item_updown );
}
这就是我的输出:
Array
(
[0] => Array
(
[0] => <span class="down"><span class
)
[1] => Array
(
[0] => down
)
)
Array
(
[0] => Array
(
[0] => <span class="up"><span class
)
[1] => Array
(
[0] => up
)
)
Array
(
[0] => Array
(
[0] => <span class="down"><span class
)
[1] => Array
(
[0] => down
)
)
我对foreach的问题是:我如何能够分别显示每个阵列?
我不知道foreach是否是正确的方法。
我希望你了解我并知道我想要什么。
我希望你能帮助我!!
答案 0 :(得分:0)
通常,我建议不要使用正则表达式来解析HTML as noted in a previous reply。
然而,对于这种相当有限的用途,我认为你可能会侥幸逃脱。请注意这样一个事实:如果基础HTML发生变化,或者与上面的示例不同,这将不再起作用
// If you _only_ need the class:
$pattern = '~<td class="fluctuation">\s*<span class="([^"]+).*?</td>~si';
// If you need the class as well:
$pattern = '~<td class="fluctuation">\s*(<span class="([^"]+).*?)\s*</td>~si';
if( preg_match_all($pattern, $input, $item_updown_select ) );
第一个RegEx将只为您提供课程$matches[1]
,而第二个将为您提供$matches[2]
中的课程。
我想强烈建议学习DOMdocument,因为这样可以更轻松地使用HTML,并且更容易修改。您可以从following tutorial开始。
答案 1 :(得分:0)
使用DOMDocument解析HTML:
$html = <<<EOD
<table>
<tr>
<td class="fluctuation">
<span class="down"><span class="icon"></span>13.31%</span>
</td>
<td class="fluctuation">
<span class="up"><span class="icon"></span>3.45%</span>
</td>
<td class="fluctuation">
<span class="up"><span class="icon"></span>4.56%</span>
</td>
<td class="fluctuation">
<span class="up"><span class="icon"></span>10.07%</span>
</td>
</tr>
</table>
EOD;
$dom = new DOMDocument();
$dom->loadHTML($html);
$finder = new DomXPath($dom);
$nodes = $finder->query("//td[@class='fluctuation']");
$classes = array();
foreach($nodes as $node) {
foreach($finder->query("span", $node) as $span) {
$class = $span->getAttribute('class');
$classes[] = $class;
}
}
print_r($classes);
<强>输出:强>
Array
(
[0] => down
[1] => up
[2] => up
[3] => up
)