PHP Простой HTML DOM Parser - PullRequest
       0

PHP Простой HTML DOM Parser

0 голосов
/ 29 сентября 2010

Почему вы не можете использовать методы обхода класса с переменными для установки параметров

Например, используя этот массив:

array(0 => array('element' => 'img[src=images/more.gif]', 'attribute' => 'parent()->href'));

это работает:

foreach($this->contents->find($target[$key]['element']) as $keyz => $found) 
{
 $this->store[$keyz] = $found->parent()->href
}

Но это не так:

foreach($this->contents->find($target[$key]['element']) as $keyz => $found) 
    {
     $this->store[$keyz] = $found->$target[$key]['attribute'];
    }

Я попытался изменить их массив следующим образом:

array(0 => array('element' => 'img[src=images/more.gif]', 'traverse' => 'parent()', 'attribute' => 'href')

А потом пытается:

foreach($this->contents->find($target[$key]['element']) as $keyz => $found) 
        {
         $this->store[$keyz] = $found->$target[$key]['traverse']->$target[$key]['attribute'];
        }

не работает.

При обоих сбоях print_r ($ this-> store) просто дает Array ();

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Это не имеет ничего общего с этим медленным простым HTML-трюком: это не то, как работает PHP, ваша строка parent()->href не будет интерпретироваться как вызов этих элементов.Если вам это нужно, вы на правильном пути, но вы должны различать функции и атрибуты.Примерно так:

array(
  'element' => 'img[src=images/more.gif]',
  'traverse' => array(
     array('parent','function'),
     array('attribute' ,'property');
...

$result = $found
foreach($target[$key]['traverse'] as $step){
   switch($step[1]){
       case 'function':
           $function = $step[0];
           $result = $found->$function();
           break;
       case 'property':
           $property = $step[0];
           $result = $found->$property;
           break;
       default:
           trigger_error("Unknown step method ".$step[1].": not an property or function",E_USER_ERROR);
   }
}
$this->store[$keyz] = $result;

Или это может работать с вашими исходными строками:

array(
   'element' => 'img[src=images/more.gif]',
   'attribute' => 'parent()->href'));

...
$result = $found;
foreach(explode('->',$target[$key]['attribute']) as $step){
    if(substr($step,-2) == '()'){
        $function = substr($step,0, strlen($step)-2);
        $result = $result->$function();
    } else {
        $result = $result->$step;
    }
}
$this->store[$keyz] = $result;
0 голосов
/ 29 сентября 2010

Спасибо, Вриккен, на основании твоего совета я придумал это, которое отлично работает

foreach($this->contents->find($target[$key]['element']) as $keyz => $found) 
            {
             if (!isset($target[$key]['traverse']) && !isset($target[$key]['attribute']))
             {
             $this->store[] = $found;
             }
             else if (isset($target[$key]['traverse']) && !isset($target[$key]['attribute']) 
             {
            $function = $target[$key]['traverse'];
            $this->store[] = $found->$function();            
           }
             else if (isset($target[$key]['traverse']) && isset($target[$key]['attribute']))
             {
              $function = $target[$key]['traverse'];
            $this->store[] = $found->$function()->$target[$key]['attribute'];       
             }
            }
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...