2010-09-28 5 views
0

Каким образом вы не можете использовать методы, пересекающих класса с переменной, чтобы установить параметрыPHP Simple HTML DOM Parser

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

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();

ответ

0

благодарю вас Wrikken, основываясь на ваши советы, я пришел с этим, который прекрасно работает

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'];  
      } 
      } 
     } 
1

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

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

есть ли у вас рекомендации по альтернативам? Мой код довольно прост, но я не уверен, как использовать встроенные функции php. – JM4

+0

[Gordon создал хороший список] (http://stackoverflow.com/questions/3577641/how-to-parse-and-process-html-with-php/3577662#3577662) – Wrikken

Смежные вопросы