如何通过PHP和字符串函数获取所有TD值

如何通过PHP和字符串函数获取所有TD值,php,string,parsing,substr,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."<

我需要从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]);
}

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

找到\o/

(我的英语不是很好,所以这可能是不可理解的,但至少代码是有效的:p)

事实上,正如@Jack所说,你给substr的第三个参数是错误的(它应该是剪切的长度,所以你必须将第一个pos减去最后一个pos),你也有pos问题,因为你搜索的东西有一个长度,你必须计算它,只得到TDs的内容
是4个字符,而
是5个字符;因此,您必须在第一个pos中添加+4以获得内容位置的开头,在后处理substr中的最后一个td中添加5以删除结尾

以下代码正常工作:

$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='abcdefghi';
echo$td_num=substr_count($string');
对于($i=0;$i).htmlentities($td_值[$i])。
; } var_转储(td_值);
或者,如果您的源是可信的,您可以使用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]);
}
$string='abcdefghi';
$matches=null;
if(preg#u match_all('#(.*)#isU',$string,$matches)){
var_dump($matches[1]);
}
考虑simpledom。在您的情况下,它会像这样工作:

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

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/>';
}
$string='abcdefghi';
$dom=新的DOMDocument();
$dom->loadHTML($string);
foreach($dom->getElementsByTagName('td')作为$td){
echo$td->nodeValue.“
”; }
您可以使用以下命令获得td值:(输出示例)

abc
def

ghi

google://php SimpleXML使用HTML解析器库,比如@Barmar,有没有理由选择它而不是PHP附带的SimpleXML或DOMDocument?
substr()
将长度作为第三个参数,而不是另一个位置。@Barmar任何对其稍感兴趣的人都会发现XPath是一个功能无穷强大的概念:)好吧,fwiw,它确实比使用
substr()
strpos()
:)更好。这只是一个问题的答案:如何以不同的方式解析TD值^^+1因为你是唯一一个解释为什么他的代码不起作用的人。
$html = str_get_html($string);
foreach ($html->find('td') as $td)
    echo $td->innertext."\n";
$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/>';
}