PHP yüklü bir sayfanın bölümlerini ayıklanıyor (RegEx)

3 Cevap php

Ben bir PHP site içinde birleştirmek için çalışıyorum bir bülten sistemi var. PHP site bir içerik alanı yükler ve aynı zamanda sayfanın baş içine komut yükler. Bu site için oluşturulan kod çalışıyor ama şimdi ben dahil çalışıyorum bülten var.

Aslında ben AJAX ve jQuery aramaların bir iFrame ama miktarını kullanmak için gidiyordu bu oldukça karmaşık hale getirir.

Ben de bir değişken olarak bülten sayfasını yüklemek için cURL kullanabilirsiniz düşündüm. Sonra gövde etiketleri arasına içeriği kapmak ve içerik alanında bu yerleştirmek için RegEx kullanmak için gidiyordu. Sonunda kafa ile arama ve herhangi bir komut kapmak için tekrar RegEx kullanmak için gidiyordu.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $config_live_site."lib/alerts/user/update.php?email=test@test.com.au"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HEADER, 0);
$loaded_result = curl_exec( $ch ); # run!
curl_close($ch);

// Capture the body content and place in $_content
if (preg_match('%<body>([\s\S]*)</body>%', $loaded_result, $regs)) {
 $_content .= $regs[1];
} else {
 $_content .= "<p>No content to display.</p>";
}

// Capture the scripts and place in the head
if (preg_match('%(<script type="text/javascript">[\s\S]*</script>)%', $loaded_result, $regs)) {
 $headDetails .= $regs[0];
}

Bu çoğu zaman çalışır ancak bir komut belgenin gövdesinde varsa bu son / script 'aşağı yakalar.

Benim soru sanırım iki yönlüdür ...

A. daha iyi bir genel yaklaşım var mı (bu bülten kod çok fazla düzenleme olmadan hızlı bir çözüm olması gerekiyor bu yüzden benim son çok kısa?)

B. Ne RegEx Ben sadece ilk senaryoyu yakalamak için kullanmak gerekir?

3 Cevap

Sana * sonra komut regex bir ? eklemeniz gerekir düşünmek çok açgözlü değil. Açgözlü Regex maç kadar (ilk açılış etiketi ve son kapanış arasındaki her şeyi) mümkün olduğu gibi, mümkün olduğunca az olmayan açgözlü maçı (açılış etiketi ve ilk kapanış etiketi aramda ne sadece). Deneyin:

%(<script type="text/javascript">[\s\S]*?</script>)%

Belirtildiği gibi, preg_match_all olarak değiştirin ve sadece yerine ilk ve son script etiketleri arasındaki her şeyin tek tek komut bölümleri aynı olmalıdır.

A: Ben mutlaka geçerli olmayan HTML sayfaları ihtiyaç bit ayıklamak için düzenli ifadeler kullanarak hiçbir sorunları görüyoruz. Aslında ben çalıştım spidering bazı çözümler tam olarak yaptım.

B: Kullan preg_match_all() yerine preg_match (). preg_match_all () dizenin sonuna kadar devam edecek ve tüm maçları dönecektir ise preg_match () sadece ilk maçı yakalar.

Hızlı ve kirli bir cevap olabilir: sadece çektikten sonra vücut içeriği silin. Sonra devam

if (preg_match('%<head>([\s\S]*)</head>%', $loaded_result, $regs)) {
   $_header .= $regs[1];
} else {
   $_header .= "<p>No content to display.</p>";
}

sonra sadece başlığına regex uygulamak

if (preg_match('%(<script type="text/javascript">[\s\S]*</script>)%', $_header, $regs)) {
   $headDetails .= $regs[0];
}

Eğer kıvrılma elde html de oluşmuş ise, sizin çıkarma gerçekleştirmek için SimpleXML kullanmalısınız. Adından da anlaşılacağı gibi, kullanımı çok basittir.

$xml = simplexml_load_string($loaded_content);

$body = $xml->body->asXML();

$scripts = $xml->xpath('//head/script');
foreach ($scripts as $script) {
  $_scripts .= $script->asXML();
}

Html de oluşmuş değilse, o zaman bunu normalleştirmek için düzenli başvurmak HAVA (veya daha iyisi, komut düzeltmek o çıktı geçersiz html içeriği)