如何通过PHP和String函数获取所有TD值

时间:2014-07-14 02:31:15

标签: php string parsing substr

我需要从TD获取数据,变量是一个字符串:

$string='<tr><td>abc</td><td>def</td><td>ghi</td></tr>';
echo $td_num = substr_count($string, '<td>');
for ($i=0;$i<$td_num;$i++)
{
echo "<br /><br />".$i."<br />";

$first_td[$i] = strpos($string, '<td>');
echo 'First position: '.$first_td[$i]."<br />"; 

$last_td[$i]=strpos($string, "</td>");
echo 'Last position: '.$last_td[$i]."<br />";

$td_value[$i]=substr($string,$first_td[$i],$last_td[$i]);

echo "TD Value: ".$td_value[$i]."<br />";   
echo $string_size = strlen($string)."<br />";

$string = substr($string,$last_td[$i]);
}

结果是:

       3

       0
       First position: 4
       Last position: 11
       TD Value: abc45


       1
       First position: 5
       Last position: 0
       TD Value: 
       34


       2
       First position: 5
       Last position: 0 
       TD Value: 
       34

请告诉我,为什么它不起作用?我怎样才能使它工作?如何以不同方式解析TD值?

3 个答案:

答案 0 :(得分:4)

DOMDocument也可用于此:

$string = '<tr><td>abc</td><td>def</td><td>ghi</td></tr>';
$dom = new DOMDocument();
$dom->loadHTML($string);
foreach($dom->getElementsByTagName('td') as $td) {
    echo $td->nodeValue . '<br/>';
}

您可以使用以下方法获取td值:(输出样本)

abc
def
GHI

答案 1 :(得分:1)

考虑简单,link here。在你的情况下它会像这样工作:

$html = str_get_html($string);
foreach ($html->find('td') as $td)
    echo $td->innertext."\n";

答案 2 :(得分:0)

找到\ o /

(我不是很擅长英语,所以也许这是不可理解的,但至少,代码有效:P)

事实上你给了substr一个错误的第三个参数就像所说的@Jack(它应该是剪切的长度,所以你必须减去第一个pos到最后一个pos),你也有pos probs,因为你搜索的是什么有一个长度,你必须把它计入只有TD <td>的内容是4个字符长,</td>是5;因此,您必须在第一个pos中添加+4以获取内容位置的开头,并在after process substr中将last_td添加5以删除结束</td>

以下代码正常运行:

$string='<tr><td>abc</td><td>def</td><td>ghi</td></tr>';

echo $td_num = substr_count($string, '<td>');

for ($i=0;$i<$td_num;$i++)
{
    echo "<br /><br />".$i."<br />";

    $first_td[$i] = strpos($string, '<td>') + 4; 
    $last_td[$i]  = strpos($string, '</td>');
    $td_value[$i] = substr($string,$first_td[$i],$last_td[$i]-$first_td[$i]);

    echo 'First position: '.$first_td[$i].'<br />';
    echo 'Last position:  '.$last_td[$i] .'<br />';
    echo 'TD Value: '.htmlentities($td_value[$i]).'<br />';   
    echo $string_size = strlen($string).'<br />';

    $string = substr($string,$last_td[$i]+5);
}

var_dump($first_td, $last_td, $td_value, $string);

但如果你不需要内容的地方,你可以使用这个:

$string='<tr><td>abc</td><td>def</td><td>ghi</td></tr>';

$td_num = substr_count($string, '<td>');

for ($i=0;$i<$td_num;$i++)
{   
    $first_td = strpos($string, '<td>') + 4; 
    $last_td  = strpos($string, '</td>');
    $td_values[$i] = substr($string,$first_td,$last_td-$first_td);
    $string = substr($string,$last_td+5);

    echo 'TD Value ['.$i.'] => '.htmlentities($td_values[$i]).'<br />';
}

var_dump($td_values);

如果您的来源是可信任的,那么您可以使用preg_match_all

$string='<tr><td>abc</td><td>def</td><TD>ghi</TD></tr>';

$matches = null;

if( preg_match_all('#<td>(.*)</td>#isU', $string, $matches) ){
    var_dump($matches[1]);
}