PHP Simple HTML DOM Parser находит элементы с несколькими атрибутами

Я использую Simple HTML DOM Parser, но не могу понять, как получить следующее:

Представьте, что у меня есть это:

<td style"color:#e05206" width"22" height="58">OK</td>
<td style"color:#e05206" width"22" height="58" align="center">NOT OK</td>
<td style"color:#ffffff" width"22" height="58">NOT OK</td>

Я хочу поправиться.

Я пробовал что-то вроде этого:

$results = $html->find('td[style*=color:#e05206], td[width*="22"], td[height*=58], td[!align]');

Я думал, что это будет правильный ответ, но это не так, потому что он применяет OR, а не AND.

Я хочу получить только ОК, а не все элементы. Подводя итог, я хотел бы, чтобы td имел V, X, Y, а не Z. Возможно ли это?

Спасибо за ваши ответы!

Обновление: я не ищу подтверждения, это может быть что угодно другое. Я ищу, чтобы получить td, у которого есть атрибут V=что-то И X=что-то И Y=что-то И НЕ Z.


person Mehdi.Sqalli    schedule 18.04.2013    source источник
comment
Я предполагаю, что вы все усложняете, используя jquery, это может быть легко достигнуто. $('td').each(function(){ if(($('this').text())=='OK') { //do something} });   -  person dreamweiver    schedule 18.04.2013
comment
Как насчет использования find('td[style="color:#e05206"]');, а затем результатов foreach для проверки if ($e->hasAttribute(align) == false){ // do something }   -  person Turcia    schedule 18.04.2013
comment
Я не уверен. Но попробуйте $html-›find('td[style*=color:#e05206][!align]). В jQuery вы можете комбинировать атрибуты-селекторы. Простой парсер HTML работает как jQuery.   -  person mr_app    schedule 18.04.2013
comment
@Turcia Это может быть решением. Но мой анализ сложен, и я хотел бы более универсальное решение.   -  person Mehdi.Sqalli    schedule 18.04.2013
comment
@dreamweiver - я думаю, смысл в том, чтобы добраться до него, не зная текста.   -  person pguardiario    schedule 18.04.2013
comment
хорошо, не проблема, теперь, если текст динамический, тогда сравните переменную с текстовым значением на основе того, что в нем хранится. в любом случае логика остается неизменной, даже при любом значении.   -  person dreamweiver    schedule 18.04.2013


Ответы (3)


В идеале вы хотите иметь возможность добраться до этого с помощью:

'td:not([align])[style="color:#e05206"]'

or

'td[style="color:#e05206"]:not([align])'

Вы не можете сделать это с помощью простого HTML-дома, потому что он простой.

Хорошей новостью является то, что вы можете сделать это с помощью phpquery.

person pguardiario    schedule 18.04.2013
comment
кажется, что phpquery больше не обновляется... Вместо этого я использовал ganon. - person Mehdi.Sqalli; 19.04.2013
comment
Неплохой выбор, но я все же считаю phpquery лучшим на данный момент. - person pguardiario; 19.04.2013

Итак, вот что я сделал.

Я использовал библиотеку ganon.

$results = $html('td[style + width + height + !align]');

lib позаботится практически обо всем.

https://code.google.com/p/ganon/

person Mehdi.Sqalli    schedule 19.04.2013
comment
Это, безусловно, далеко от стандартного CSS, поэтому мне интересно, стоит ли к нему привыкать. - person pguardiario; 19.04.2013

var OkElement = new Array();
$("table tr").find("td").each(function(){
   tdValue = $(this).text();
   if(tdValue == "OK"){
      OkElement.push($(this).attr('id');
   }
});

Объяснение: здесь мы зацикливаем все элементы td DOM, а затем проверяем значение OK. Для каждого цикла это указывает на текущие элементы td и получение значения td и проверку того, является ли текстовое значение в порядке или нет, если это значение в порядке, то мы помещаем идентификатор элемента td в массив. Наконец, массив содержит только идентификаторы элементов td, которые содержат текст OK. Примечание. Вы должны указать уникальный идентификатор для каждого элемента td.

    <td id="x1" style"color:#e05206" width"22" height="58">OK</td>
    <td id="x2" style"color:#e05206" width"22" height="58" align="center">NOT OK</td>
    <td id="x3" style"color:#ffffff" width"22" height="58">NOT OK</td>

Потому что, даже если вы получаете элемент td, вы не можете манипулировать соответствующим элементом td, не имея идентификатора. Теперь вы получите x1 в массиве OkElement, теперь вы можете манипулировать этим div по своему усмотрению Пример

for(var i=0;i<OkElement.length;i++){
    $("#"+OkElement[i]).attr('style','background-color : red');
}

Здесь, в моем примере, я применяю красный цвет фона для элементов td, у которых есть OK

person VenkateshKumar    schedule 18.04.2013
comment
Я получаю HTML из внешнего источника. Я могу только разобрать. - person Mehdi.Sqalli; 18.04.2013
comment
Можешь ли ты упорядочить предложение - person VenkateshKumar; 18.04.2013
comment
о, я понял, вы говорите, что не можете добавить идентификаторы в таблицу, не так ли? - person VenkateshKumar; 18.04.2013
comment
так что мы можем получить это и по-другому - person VenkateshKumar; 18.04.2013