Analisando o conteúdo da tabela em php / regex e obtendo resultado por td

Eu tenho uma mesa como essa que passei um dia inteiro tentando obter os dados:

Monthely rent Fr. 1'950.
Rooms(s) 3
Surface 93m2
Date of Contract 01.04.17

Como você pode ver os dados estão bem organizados, e estou tentando obter esse resultado:

 monthly rent => Fr. 1'950. Rooms(s) => 3 Surface => 93m2 Date of Contract => 01.04.17 

Eu tenho a tabela contida dentro de uma $table variável e tentei usar o DOM

 $dom = new DOMDocument(); $dom->loadHTML($table); $dom = new \DomXPath($dom); $result = $dom->query('//table/tr'); return $result; 

Mas, sem sucesso, existe uma maneira mais fácil de obter o conteúdo em php / regex?

Você está no caminho certo com DOM e Xpath. Não use expressões regulares para analisar HTML / XML. RegEx é para correspondência de texto e muitas vezes usado como parte de um analisador. Mas um analisador para um formato sabe disso – um RegEx não.

Você deve manter seus nomes variables ​​um pouco mais limpos. Não atribua tipos diferentes à mesma variável no mesmo contexto. Só mostra que o nome da variável pode ser genérico.

DOMXpath::query() permite que você use expressões Xpath, mas apenas expressão que retorna uma lista de nó. DOMXpath::evaluate() permite obter valores escalares.

Então, você pode buscar os elementos tr , iterá-los e usar expressão adicional para buscar os dois valores usando o elemento tr como o contexto.

 $document = new \DOMDocument(); $document->loadHTML($table); $xpath = new \DOMXPath($document); foreach ($xpath->evaluate('//table/tr') as $tr) { var_dump( $xpath->evaluate('string(td[1])', $tr), $xpath->evaluate('string(td[2]/strong)', $tr) ); } 

Saída:

 string(13) "Monthely rent" string(11) "Fr. 1'950. " string(8) "Rooms(s)" string(1) "3" string(7) "Surface" string(4) "93m2" string(16) "Date of Contract" string(8) "01.04.17" 

Experimente isso:

 $dom = new DOMDocument(); $dom->loadHTML($table); $dom = new \DomXPath($dom); $result = $dom->query('//table/tr/td/strong'); foreach($result as $item) { echo $item->nodeValue . "\n"; } 

Isso imprimirá o elemento. No entanto, você provavelmente deseja configurar seus dados de uma maneira que você não precisa lidar com as tags html como . Você pode querer usar xml ou mesmo json.