Php analiza html dom y cuenta filas específicas

estoy usando el "Analizador de php DOM simple" para analizar una tabla html y contar su fila.

Resolví contar todas las filas (tr) con este código:

$rows = $table->find('.trClass');
$count = count($rows);
echo $count;

Y obtengo correctamente el número de todas las filas de la tabla.

Ahora quiero contar solo las filas que contienen un determinado td (con una cadena específica).
Podríamos suponer que quiero contar solo las filas con este td:

<td class="tdClass" align="center" nowrap="">TARGET STRING</td>

¿Cómo puedo modificar el primer código para que coincida con este alcance?

Traté de usar "preg_match" o "preg_match_all" pero no tengo mucha experiencia en eso, así que extraño la sintaxis correcta... creo.

¡Se agradece mucho cualquier ayuda!

preguntado el 03 de mayo de 12 a las 22:05

2 Respuestas

Qué tal si:

<?php
$targetString = 'TARGET STRING';
$rows = $table->find('.trClass');

$count = 0;
foreach($rows as $row) {
    foreach($row->find('td') as $td) {
        if ($td->innertext === $targetString) {
            $count++;
            break;
        }
    }
}

contestado el 04 de mayo de 12 a las 08:05

Muchas gracias, pero me aparece un error con su código: "error de sintaxis, '(' inesperado, esperando T_STRING o T_VARIABLE o '{' o '$' in", refiriéndose a "foreach($row->('td ') como $td) {" línea.. - Ricardo Malesani

Ok, descubrí la solución para el error (te perdiste "buscar") y ahora funciona muy bien. Muchas gracias !!! - Ricardo Malesani

Sí, lo siento, me perdí esa. Claramente, algo salió mal con el copiar y pegar :). Se corrigió también en el código ahora. - styxxy

No te preocupes y gracias de nuevo. Ahora me enfrento a un desafío más fuerte con respecto a esto. Puede encontrar la nueva pregunta aquí: stackoverflow.com/questions/10453380/… - Ricardo Malesani

Vale, le echaré un vistazo. En realidad, no es mucho de un desafío más fuerte. - styxxy

$target = 'TARGET STRING';

$n_matchingrows = 0;

$rows = $table->find('tr.trClass');
foreach($rows as $row) {
    $cell = $row->find('td.tdClass[align=center][nowrap=""]', 0);
    if ($cell and $cell->innertext===$target) {
       $n_matchingrows += 1;
    }
}

contestado el 03 de mayo de 12 a las 22:05

Pequeño error en este enfoque, si un TR tiene múltiples TD con la cadena de destino, su conteo será incorrecto;). - styxxy

Para responder a su duda, la cadena de destino podría estar contenida solo una vez en cada fila coincidente (solo una cadena de destino de TD para la fila coincidente) - Ricardo Malesani

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.