Belirli bir dize bulma ve onu izleyen veri yakalama

3 Cevap php

Ben uzun zaman önce bir site inşa edilmiş ve şimdi ben kopyalama olmadan bir veritabanına verileri yerleştirmek ve ben site veritabanı tahrik yapabilirsiniz böylece büyüdü 400 + sayfa yapıştırarak istiyorum.

Sitemin böyle meta etiketleri (farklı her sayfa) vardır:

<meta name="clan_name" content="Dark Mage" />

Peki ben yapıyorum bir dize olarak bir değişken tüm HTML sayfasını yerleştirmek için cURL kullanıyor. Ben de fopen vs .. ile bunu yapabilirsiniz, ama ben bu konularda sanmıyorum.

Ben 'Dark Mage' bulmak için dize üzerinden kayması ve bir değişkende saklamak gerekir (bu yüzden sql içine koyabilirsiniz)

Herhangi bir değişkende saklamak Dark Mage bulmak için en iyi yol üzerinde fikir? Ben substr kullanmaya çalışıyor ve sonra sadece clan_name yılında e karakter sayısını çıkarılarak, ama bu bir büstü oldu.

3 Cevap

Sadece PHP DOM işlevlerini kullanarak sayfa ayrıştırmak özellikle loadHTML(). Daha sonra ağaç yürümek ya da aradığınız düğümleri bulmak için XPath'i kullanabilirsiniz.

<?
$doc = new DomDocument;
$doc->loadHTML($html);
$meta = $doc->getElementsByTagName('meta');
foreach ($meta as $data) {
  $name = $meta->getAttribute('name');
  if ($name == 'clan_name') {
    $content = $meta->getAttribute('content');
    // TODO handle content for clan_name
  }
} 
?>

Eğer belleğe HTML dize yüklenemedi önce (örneğin <script> gibi) belirli etiketleri kaldırmak istiyorsanız EDIT, strip_tags() işlevini kullanarak deneyin. Böyle bir şey sadece meta etiketleri tutacak:

<?
  $html = strip_tags($html, '<meta>');
?>

regular expression PHP'nin ile, aşağıdaki gibi bir kullanın preg_match():

/<meta name="clan_name" content="([^"]+)"/

Düzenli ifadeler ile aşina değilseniz, okumaya devam edin.

Başında ve sonunda öne eğik çizgiler düzenli ifadeyi sınırlandırmak. Sınırlandırıcıları içindeki şeyler sonuna doğru dışında oldukça basittir.

Kare parantezler character class sınırlandırmak ve karakter sınıfının başında şapka bir olumsuzlama-operatörü; birlikte ele alındığında, o zaman, bu karakter sınıfı:

[^"]

"Bir çift tırnak olmayan herhangi bir karakter maç" anlamına gelir.

+ Bir quantifier, hangi önceki madde en az bir kez meydana gerektirir ve ilk bitişik göründükleri gibi önceki öğe gibi birçok maçlar olduğunu. Yani bu:

[^"]+

"çift-tırnak değil, bir veya daha fazla karakter maç" anlamına gelir.

Son olarak, parantez düzenli ifade motoru subpattern aralarında bir şey saklamak için neden. Yani bu:

([^"]+)

"çift-tırnak değil, bir veya daha fazla karakter maç ve eşleştirilmiş bir alt modeli olarak saklamak anlamına gelir.

PHP, preg_match () depolar başvuruya göre geçiren bir dizi maçlar. Ek alt-desenler varsa, tam deseni benzeri dizinin, ikinci elemanı olarak ilk alt-desen, ve birinci elemanın saklanır.

Yani, bir HTML sayfası varsayarak değişken "$ sayfa", aşağıdaki kodu vardır:

$matches = array();
$found = preg_match('/<meta name="clan_name" content="([^"]+)"/', $page, $matches);

if ($found) {
    $clan_name = $matches[1];
}

Size istediğinizi almalısınız.

Kullan preg_match. Olası bir düzenli ifade deseni /clan_name.+content="([^"]+)"/