Bir html etiketi çoklu hatları üzerinden böler olmadığını belirlemek için nasıl

6 Cevap php

Ben kazıma web sayfalarını içeren bir php komut dosyası yazıyorum. Şu anda, komut satır sayfa satır analiz eder, fakat gibi, birden fazla satıra yayılan bir etiketi varsa kırılır

<img src="example.jpg"
alt="example">

Kötü kötü gelirse, ben muhtemelen> yakın onları yeniden yerleştirerek, daha sonra tüm satır sonlarını kaldırarak sayfasını önişlem olabilir, ama bu bir kludge gibi görünüyor.

İdeal, satıra yayılan bir etiket algılamak sadece bu hatları birleşmek ve işleme devam etmek mümkün olurdu. Yani bu tespit etmek için en iyi yöntem nedir?

6 Cevap

Belki de gelecekteki projeler için bir ayrıştırma kütüphane kullanacağız, ama bu tür bir kenara eldeki soru geliyor. Bu benim geçerli çözümdür. rstrpos strpos, ancak ters yönden. Örnek kullanım:

for($i=0; $i<count($lines); $i++)
{
    $line = handle_mulitline_tags(&$i, $line, $lines);
}

Ve işte o uygulama var:

function rstrpos($string, $charToFind, $relativePos)
{
    $searchPos = $relativePos;
    $searchChar = '';

    while (($searchChar != $charToFind)&&($searchPos>-1))
    {
        $newPos = $searchPos-1;
        $searchChar = substr($string,$newPos,strlen($charToFind));
        $searchPos = $newPos;
    }

    if (!empty($searchChar))
    {
        return $searchPos;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function handle_multiline_tags(&$i, $line, $lines)
{
    //if a tag is opened but not closed before a line break,

    $open = rstrpos($line, '<', strlen($line));
    $close = rstrpos($line, '>', strlen($line));
    if(($open > $close)&&($open > -1)&&($close > -1))
    {
    	$i++;
    	return trim($line).trim(handle_multiline_tags(&$i, $lines[$i], $lines));
    }
    else
    {
    	return trim($line);
    }
}

Bu muhtemelen bir şekilde optimize edilebilir, ama amaçlar için, yeterli bulunuyor.

Bu benim pet peeves: never ayrıştırma HTML elle. Never ayrıştırma HTML regexplerde ile. Never ayrıştırma HTML dize karşılaştırmaları ile. Always HTML ayrıştırmak için bir HTML çözümleyici kullanabilirsiniz - onlar için oradalar.

Ben herhangi bir PHP yaptık bu yana uzun bir zaman oldu, ama hızlı bir arama this PHP5 HTML parser yukarı döndü.

Başkasının kullanmak, bir ayrıştırıcı yazmayın: DOMDocument::loadHTML - sadece biri, ben de bir yeri olduğunu düşünüyorum.

Peki, bu soruyu cevaplamak ve bir görüş daha var, ama ... değil

Ben iyi kazıma stratejisi (ve dolayısıyla, bu sorunu ortadan kaldırmak için) HTML doğal olmayan çizgi, bir HTML satır analiz etmek olmadığını düşünüyorum, ama doğal sınırlayıcıyla bunu analiz etmek: <> çiftleri.

Elbette iki tür olacak:

  • Hemen kapatılır etiketi elemanları, örneğin, < br />
  • Ayrı bir kapatma etiketi, örneğin, Metin < / P>

Hemen paragraf (p) etiketleri durumunda bu stratejiyi kullanarak avantaj görebilirsiniz: Bu mutilin yerine kapanış etiketi nerede izlemek zorunda paragraflarına ayrıştırmak için daha kolay olacaktır.

Neden bir etiket daha sonra bir satır dize sonraki satırı ekleyin ve açılış ayracı önce kısmına taşımak açıklıklı o zaman, etiket açıklıklar ve kapanması için dize denetleyin, bir çizgi okumak, ve bir dizeye koymayın işlenen dize. Sonra sadece bu yapıyor tüm dosya üzerinden ayrıştırmak. Onun ama çalışması gerekir güzel değil.

Eğer ayrıştırma geçerli yöntemine gerek sopa var, ve bir regex varsa, birden çok hatları üzerinden span multi-line flag "m" kullanabilirsiniz.