2010-05-17 7 views
2

Привет Я пытаюсь реализовать сценарий скрипинга экрана на своем веб-сайте и до сих пор имеет следующий набор. То, что я в конечном счете пытаюсь сделать, это заменить все ссылки в переменной $ results, имеющей «ResultsDetails.aspx?». на "results-scrape-details /", затем выводятся снова. Может кто-то указать мне верное направление?Экран Скребок

<?php 
$url = "http://mysite:90/Testing/label/stuff/ResultsIndex.aspx"; 
$raw = file_get_contents($url); 
$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B"); 
$content = str_replace($newlines, "", html_entity_decode($raw)); 
$start = strpos($content,"<div id='pageBack'"); 
$end = strpos($content,'</body>',$start) + 6; 
$results = substr($content,$start,$end-$start); 
$pattern = 'ResultsDetails.aspx?'; 
$replacement = 'results-scrape-details/'; 
preg_replace($pattern, $replacement, $results); 
echo $results; 

ответ

10

Используйте инструмент DOM, например PHP Simple HTML DOM. С его помощью вы можете найти все ссылки, которые вы ищете, с синтаксисом Jqueryish.

// Create DOM object from HTML source 
$dom = file_get_html('http://www.domain.com/path/to/page'); 
// Iterate all matching links 
foreach ($dom->find('a[href^=ResultsDetails.aspx') as $node) { 
    // Replace href attribute value 
    $node->href = 'results-scrape-detail/'; 
} 
// Output modified DOM 
echo $dom->outertext; 
+1

быстрее, чем мне - удаление мой ответ. Хотя я буду замечать, что он может захотеть использовать '-> find ('a [href * = ...');' который означает «содержит», а не «начинается с» в зависимости от того, где эта строка отображается в значении HREF. Кроме того, нет метода -> externalhtml, только внешний текст (я исправил в вашем примере) – Erik

+0

Упс, слишком рано утром, спасибо за редактирование :-) –

+0

Это заменит ссылки только на нефиксированные относительные URL жестко закодированные. – symcbean

0

A? char имеет особое значение в регулярных выражениях: либо избегать его, либо использовать тот же код, либо заменять preg_replace на str_ireplace() (я бы рекомендовал последний подход, так как он также более эффективен).

(и если вызов html_entity_decode действительно есть?)

C.