我正在尝试将来自不同域名的 XML 文件作为字符串加载。我想要的只是 xml 文件的 <title></title> 标记中的文本数组,所以我在想,因为我使用的是 php4,所以最简单的方法是对其进行正则表达式来获取它们。有人可以解释如何将 XML 作为字符串加载吗?谢谢!
问问题
5029 次
4 回答
2
首先使用 file_get_contents(' http://www.example.com/ ');
要获取文件,请插入到 var. 解析 xml 后,链接为 http://php.net/manual/en/function.xml-parse.php 在评论中有示例
于 2009-06-01T13:58:17.163 回答
2
您可以像下面的示例一样使用 cURL。我应该补充一点,基于正则表达式的 XML 解析通常不是一个好主意,使用真正的解析器可能会更好,尤其是在它变得更复杂的情况下。
您可能还想添加一些正则表达式修饰符以使其跨多行等工作,但我认为问题更多是关于将内容提取到字符串中。
<?php
$curl = curl_init('http://www.example.com');
//make content be returned by curl_exec rather than being printed immediately
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
if ($result !== false) {
if (preg_match('|<title>(.*)</title>|i', $result, $matches)) {
echo "Title is '{$matches[1]}'";
} else {
//did not find the title
}
} else {
//request failed
die (curl_error($curl));
}
于 2009-06-01T14:57:05.703 回答
2
如果您正在加载格式正确的 xml,请跳过基于字符的解析,并使用 DOM 函数:
$d = new DOMDocument;
$d->load("http://url/file.xml");
$titles = $d->getElementsByTagName('title');
if ($titles) {
echo $titles->item(0)->nodeValue;
}
如果由于 php 的设置方式而无法使用 DOMDocument::load() ,请使用 curl 抓取文件,然后执行以下操作:
$d = new DOMDocument;
$d->loadXML($grabbedfile);
...
于 2010-06-10T15:15:22.257 回答
1
我有这个功能作为一个片段:
function getHTML($url) {
if($url == false || empty($url)) return false;
$options = array(
CURLOPT_URL => $url, // URL of the page
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 3, // stop after 3 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
//Ending all that cURL mess...
//Removing linebreaks,multiple whitespace and tabs for easier Regexing
$content = str_replace(array("\n", "\r", "\t", "\o", "\xOB"), '', $content);
$content = preg_replace('/\s\s+/', ' ', $content);
$this->profilehtml = $content;
return $content;
}
这将返回没有换行符、制表符、多个空格等的 HTML,只有 1 行。
所以现在你做这个 preg_match:
$html = getHTML($url)
preg_match('|<title>(.*)</title>|iUsm',$html,$matches);
并且 $matches[1] 将拥有您需要的信息。
于 2009-06-01T14:59:36.587 回答