2008-08-29 23 views
3

Web sayfalarını kazıyarak içeren bir php komut dosyası yazıyorum. Şu anda, senaryo hattı ile sayfa hattını araştırıyor ama birden fazla satır yayılan bir etiket varsa hepsi satır sonları kaldırarak elimden muhtemelen sayfanın preprocess, Bir html etiketinin birden çok satıra bölünüp ayrılmadığı nasıl belirlenir

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

kötü kötü gelirse

gibi kırar, daha sonra en yakın > numarasından tekrar yerleştirilir, ancak bu bir kludge gibi görünür.

İdeal olarak, çizgileri kapsayan, yalnızca satırları birleştiren ve işlemeye devam eden bir etiketi algılayabileyim.
Peki bunu algılamanın en iyi yolu nedir?

cevap

1

Belki de gelecekteki projeler için bir ayrıştırma kütüphanesi kullanacağım, ama bu eldeki sorudan başka bir şey değil. Bu benim şu anki çözümüm. rstrpos strpos'dur, ancak ters yöndedir.Örnek kullanım: burada

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

Ve bu uygulama görebilirsiniz:

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, ancak benim amaçlar için, yeterli değil.

1

Eh, bu bir HTML analiz etmek değil ben en iyi kazıma stratejisi olduğunu düşünüyorum (ve dolayısıyla, bu sorunu ortadan kaldırmak için) ...

olan soruya cevap ve görüş daha, ama değil HTML'ye doğal olmayan, ancak doğal sınırlayıcı ile analiz etmek için satır satır satır: <> çiftleri.

elbette iki tip olacak: hemen kapatılır

  • Etiket elemanları, örneğin < br ayrı kapanış etiketi ihtiyaç />
  • Etiket elemanları, örneğin < p> Metin </p>

Paragraf (p) etiketleri söz konusu olduğunda bu stratejiyi kullanmanın avantajını hemen görebilirsiniz: Kapatma etiketinin nerede olduğunu izlemek yerine mutiline paragraflarını ayrıştırmak daha kolay olacaktır.

7

Bu benim evcil hayvan peeves'imden biri: asla HTML'yi el ile ayrıştırmayın. Asla Normal ifadelerle HTML'yi ayrıştırmayın. Asla Dize karşılaştırmaları ile HTML'yi ayrıştırmayın. Her zaman HTML'yi ayrıştırmak için bir HTML ayrıştırıcısı kullanın - işte onlar için var.

Herhangi bir PHP yaptığımdan çok uzun zaman geçti, ancak hızlı arama this PHP5 HTML parser'u buldu.

0

Neden bir satır okuyup bir dizeye ayarlamıyorsanız, etiket açıklıkları ve kapanışları için dizeleri kontrol edin, Bir etiket daha fazla yayılıyorsa, bir satır bir sonraki satırı dizeye ekleyin ve parçayı işlenen dizenize açılış ayracından önce. Sonra sadece bunu yaparak tüm dosyada ayrıştırın. Onun güzel değil ama işe yaramalı.

0

Geçerli ayrıştırma yönteminize bağlı olmanız gerekiyorsa ve bu bir normal ifadedir, birden çok satıra yayılmak için multi-line flag "m" değerini kullanabilirsiniz.

İlgili konular