PHP: dize gibi farklı bir sunucuya dosya yüklemek için nasıl?

3 Cevap php

Ben bir dize gibi farklı bir alan adı bir XML dosyası yüklemek için çalışıyorum. Tüm istediğim < / Title> xml dosyasının etiketleri, ben kolay yolu onları almak için onun bir regex yapmak olacaktır php4 kullanıyorum çünkü ben düşünüyorum. Birisi bir dizge olarak XML yüklemek nasıl açıklayabilir misiniz? Teşekkürler!

3 Cevap

Aşağıdaki örnekteki gibi cURL kullanabilirsiniz. Bundan daha karmaşık alır, özellikle eğer, ben regex tabanlı bir XML ayrıştırma genellikle iyi bir fikir olmadığını eklemek gerekir, ve gerçek bir çözümleyici kullanarak daha iyi olabilir.

Ayrıca vb birden hatları üzerinden çalışması için bazı regex düzenleyiciler eklemek isteyebilirsiniz, ama ben soru bir dizeye içeriğini alma hakkında daha fazla olduğunu varsayalım.

<?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)); 
}

Eğer iyi biçimlendirilmiş xml yükleme ediyorsanız, karakter tabanlı ayrıştırma atlayın ve DOM işlevlerini kullanın:

$d = new DOMDocument;
$d->load("http://url/file.xml");
$titles = $d->getElementsByTagName('title');
if ($titles) {
    echo $titles->item(0)->nodeValue;
}

Eğer nedeniyle php kurmak nasıl DOMDocument :: load () kullanamıyorsanız, kullanım kıvırmak dosyasını kapmak ve sonra yapılacaklar:

$d = new DOMDocument;
$d->loadXML($grabbedfile);
...

Ben bir pasajı olarak bu işlevi vardır:

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;
}

Yani vb hiçbir linebreaks, sekmeler, çoklu alanlar, sadece 1 hattı ile HTML döndürür.

Yani şimdi bu preg_match yapın:

$html = getHTML($url)
preg_match('|<title>(.*)</title>|iUsm',$html,$matches);

ve $ karşılaşmalar [1] size gereken bilgi olacaktır.