• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

djthyrax

[PHP]FOAF_PHP - the PHP DOM based FOAF parser

4 mensagens neste tópico

Aqui fica uma class minha para parsar FOAF (RDF) baseada numa que postei aí ainda hoje.

Isto é PHP5+ only.

<?php
/*
* 
*  FOAF_PHP  - the PHP DOM based FOAF parser
*              version 0.1
* 
*  Author: David Ferreira <djthyrax@gmail.com>
* 
* 
* Based opon:
* 	RSS_PHP - the PHP DOM based RSS Parser
* 	Author: <rssphp.net>
* 	
* 	FOAF_PHP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY.
* 
* 	Usage:
* 		Same as RSS_PHP, the only changes are that RSS becomes FOAF in functions and class' names.
*      See RSS_PHP documentation at http://rssphp.net/documentation
* 
*/

class foaf_php {

public $document;
public $channel;
public $items;

/****************************
public load methods
***/
# load FOAF by URL
	public function load($url=false, $unblock=true) {
		if($url) {
			if($unblock) {
				$this->loadParser(file_get_contents($url, false, $this->randomContext()));
			} else {
				$this->loadParser(file_get_contents($url));
			}
		}
	}
# load raw FOAF data
	public function loadFOAF($rawxml=false) {
		if($rawxml) {
			$this->loadParser($rawxml);
		}
	}

/****************************
public load methods
	@param $includeAttributes BOOLEAN
	return array;
***/
# return full foaf array
	public function getFOAF($includeAttributes=false) {
		if($includeAttributes) {
			return $this->document;
		}
		return $this->valueReturner();
	}
# return channel data
	public function getChannel($includeAttributes=false) {
		if($includeAttributes) {
			return $this->channel;
		}
		return $this->valueReturner($this->channel);
	}
# return rdf items
	public function getItems($includeAttributes=false) {
		if($includeAttributes) {
			return $this->items;
		}
		return $this->valueReturner($this->items);
	}

/****************************
internal methods
***/
private function loadParser($rss=false) {
	if($rss) {
		$this->document = array();
		$this->channel = array();
		$this->items = array();
		$DOMDocument = new DOMDocument;
		$DOMDocument->strictErrorChecking = false;
		$DOMDocument->loadXML($rss);
		$this->document = $this->extractDOM($DOMDocument->childNodes);
	}
}

private function valueReturner($valueBlock=false) {
	if(!$valueBlock) {
		$valueBlock = $this->document;
	}
	foreach($valueBlock as $valueName => $values) {
			if(isset($values['value'])) {
				$values = $values['value'];
			}
			if(is_array($values)) {
				$valueBlock[$valueName] = $this->valueReturner($values);
			} else {
				$valueBlock[$valueName] = $values;
			}
	}
	return $valueBlock;
}

private function extractDOM($nodeList,$parentNodeName=false) {
	$itemCounter = 0;
	foreach($nodeList as $values) {
		if(substr($values->nodeName,0,1) != '#') {
			if(substr($values->nodeName, 0, 4) != 'foaf') {
				$nodeName = $values->nodeName;
			} elseif($values->nodeName == 'foaf:knows') {
				$nodeName = substr($values->nodeName, 5).':'.$itemCounter;
				$itemCounter++;
			} else {
				$nodeName = substr($values->nodeName, 5);
			}
			$tempNode[$nodeName] = array();				
			if($values->attributes) {
				for($i=0;$values->attributes->item($i);$i++) {
					$tempNode[$nodeName]['properties'][$values->attributes->item($i)->nodeName] = $values->attributes->item($i)->nodeValue;
				}
			}
			if(!$values->firstChild) {
				$tempNode[$nodeName]['value'] = $values->textContent;
			} else {
				$tempNode[$nodeName]['value']  = $this->extractDOM($values->childNodes, $values->nodeName);
			}
			if(in_array($parentNodeName, array('channel','rdf:RDF'))) {
				$this->channel[$values->nodeName] = $tempNode[$nodeName];
			}
		} elseif(substr($values->nodeName,1) == 'text') {
			$tempValue = trim(preg_replace('/\s\s+/',' ',str_replace("\n",' ', $values->textContent)));
			if($tempValue) {
				$tempNode = $tempValue;
			}
		} elseif(substr($values->nodeName,1) == 'cdata-section'){
			$tempNode = $values->textContent;
		}
	}
	return $tempNode;
}

private function randomContext() {
	$headerstrings = array();
	$headerstrings['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.'.rand(0,2).'; en-US; rv:1.'.rand(2,9).'.'.rand(0,4).'.'.rand(1,9).') Gecko/2007'.rand(10,12).rand(10,30).' Firefox/2.0.'.rand(0,1).'.'.rand(1,9);
	$headerstrings['Accept-Charset'] = rand(0,1) ? 'en-gb,en;q=0.'.rand(3,8) : 'en-us,en;q=0.'.rand(3,8);
	$headerstrings['Accept-Language'] = 'en-us,en;q=0.'.rand(4,6);
	$setHeaders = 	'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'."\r\n".
					'Accept-Charset: '.$headerstrings['Accept-Charset']."\r\n".
					'Accept-Language: '.$headerstrings['Accept-Language']."\r\n".
					'User-Agent: '.$headerstrings['User-Agent']."\r\n";
	$contextOptions = array(
		'http'=>array(
			'method'=>"GET",
			'header'=>$setHeaders
		)
	);
	return stream_context_create($contextOptions);
}

}

?>

Exemplo de uso:

<?php
//header("Content-Type: text/plain");

include "lib/rdf_class.php";

$x = new foaf_php;
$x->load("http://api.hi5.com/rest/profile/foaf/18485399");
$y = $x->getFOAF(true);
$y = $y['rdf:RDF']['value']['Person']['value'];

echo "<table>
          <tr>
              <td valign=top>";
echo "<h1>My details</h1>";
printf("<table>
          <tr>
              <td><img src='%s' /></td>
              <td><b><a href='%s'>%s</a></b><br />Birthday: %s<br /><br /><a href='%s'>Hi5 Journal</a></td>
          </tr>
      </table>", $y['img']['properties']['resource'], $y['homePage']['properties']['resource'],
      			$y['givenName']['value']." ".$y['surName']['value'], $y['birthday']['value'],
      			$y['weblog']['properties']['resource']);

echo "</td><td>";
echo "<h2>My friends</h2>";
      			
echo "<table border='1'>";
echo "          <tr>
              <td align='center'><b>Picture</b></td>
              <td align='center'><b>Name</b></td>
              <td align='center'> </td>
          </tr>";
          
foreach($y as $k => $item){
if(substr($k, 0, 5) != 'knows') continue;
$item = $item['value']['Person']['value'];
printf("          <tr>
              <td align='center'><img src='%s' /></td>
              <td align='center'>%s</td>
              <td align='center'><a href='%s'>Hi5 journal</a></td>
          </tr>", $item['img']['properties']['resource'],
          		$item['givenName']['value'].' '.$item['surName']['value'],
          		$item['weblog']['properties']['resource']);	
}
echo"              </td>
          </tr>
      </table>";

Screenshot

1341757855CapturaEcra17.png

O que é FOAF? http://en.wikipedia.org/wiki/FOAF_(software)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parabens, tá muito boa, aparenta.

é bom saber que também te chamas David, :).

Vou testar, e se encontrar bugs, ou fizer alterações, posto aki.

Ty!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cool!

impec mesmo!

E que tecnologia mais cool!

Se tiveres tempo adiciona isso ao wiki, se não eu mesmo o farei :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Trata tu disso então, nunca me dei muito bem com wikis... :X

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora