2013-11-17 3 views
1

Привет Я в основном пытаюсь получить страницу через php, получить его html и изменить html (выделить некоторые ключевые слова) на бит и отобразить его как оверлей на моей странице (jquery).Относительный путь HTML-PHP к абсолютному пути

//My php page data.php 
<?php 
$html= file_get_contents($_GET['url']); 
echo $html; 
?> 

//My jquery ajax request to data.php from page main.html 
function test() 
{ 

     $.ajax({ 
      type: 'GET', 
      url: 'data.php', 
      data: 'url=http://www.developphp.com/view_lesson.php?v=338', 
      cache: false, 
      success: function(result) 
      {   
       $("#overlay").append(result); 

      } 
     }); 
    } 

} 

Как вы можете видеть, поскольку на веб-странице используется относительный URL-адрес, у меня возникают проблемы с отображением его в оверлее. Я попытался найти способ конвертировать относительно абсолютного, но не нашел ничего полезного. Можете ли вы, ребята, указать мне правильный путь?

+0

Почему, по вашему мнению, относительный URL-адрес влияет на способность показать результат ajax в div? Это не имеет смысла. – davidkonrad

+0

Скажите, есть ли у тега изображения относительный источник, так как я вынимаю только html и отображаю его на своей веб-странице, изображение не будет отображаться. Вот почему я хочу конвертировать относительно абсолютного, поэтому я могу получить это изображение. –

+0

Ах! Итак, что вы ** действительно хотите, это изменить пути в очищенном HTML до абсолютных путей? – davidkonrad

ответ

1

Я Илке @ решение charlietfl в. Тем не менее, почему-то я думаю, что имеет смысл манипулировать скрепощенным сервером контента до, передавая его клиенту. Вы можете сделать это, используя DomDocument.

Следующий код преобразует все<img>src относительных путей к абсолютным путям, прежде чем эхо результата. Используйте ту же Approch для <a> тегов href атрибутов и так далее,

error_reporting(0); //suppress DOM errors 
$basePath='http://www.developphp.com/'; //use parse_url to get the basepath dynamically 
$content=file_get_contents('http://www.developphp.com/view_lesson.php?v=338'); 
$dom=new DomDocument(); 
$dom->loadHTML($content); 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    $src=$image->attributes->getNamedItem("src")->value; 
    if (strpos($basePath, $src)<=0) { 
     $image->attributes->getNamedItem("src")->value=$basePath.$src; 
    } 
} 
echo $dom->saveHTML(); 
+0

серверная сторона наверняка будет работать, одним преимуществом на стороне клиента может быть проще отлаживать строковые тесты, выводя их на консоль, не требуя чего-то вроде firephp, чтобы сделать это. – charlietfl

+0

Эй, @charlietfl, я не знаю firephp. Я следую за вами, но я обычно разрабатываю PHP ajaxscripts, вызывая их напрямую и выводя все ошибки по временным результатам. Когда скрипт работает, я называю его javascript ajax, а затем он может перейти в производство. Вам не нужно вызывать скрипты javascript для их отладки. – davidkonrad

+0

понял ... вопрос предпочтения - это то, на что он действительно сводится. Для меня я могу быстрее отлаживать эту вещь в JS, используя php, как ничего, кроме прокси, чтобы получить контент – charlietfl

2

Может начать здесь

function test(){ 
    var domain='http://www.developphp.com/', path= 'view_lesson.php?v=338'; 
    $.ajax({ 
      type: 'GET', 
      url: 'data.php', 
      data: { url: domain + path}, 
      cache: false, 
      success: function(result) 
      {  
       var $html=updatePaths($(result)); 

       $("#overlay").append($html); 

      } 
     }); 

} 

function updatePaths($html, domain){ 
    /* loop over all images and adjust src*/ 
    $html.find('img').attr(src,function(i, src){ 
    if(src.indexOf(domain) ==-1){ 
     src= domain+src 
    } 
    return src; 
    }) 
    /* return updated jQuery object*/ 
    return $html; 

} 

Это будет работать только для простейшего случая, когда удаленный узел не использует изменение домена вы используете, как не используя www и вы. Также не будет работать, если для путей изображения задано значение ../ для перемещения по каталогу.

Вам нужно будет создать гораздо более надежный набор тестов для правильного использования конечного пути.

Моя цель в том, чтобы показать вам, как управлять ситуации

0

Со всей вашей помощи, я сделал что-то вроде этого,

Вместо того, чтобы пытаться заменить родственник по абсолютному пути, я приложил базовый url html-тэг к сломанному контенту.

<?php 
include 'URL2.php'; 
error_reporting(0); //suppress DOM errors 
$content=file_get_contents($_GET['fullURL']); //http://somewebsite.com/page1.html 
$url = new Net_URL2($_GET['fullURL']); 
$baseURL= $url->host; //http://somewebsite.com 
if(strpos($baseURL,'http://')<0) 
{ 
    $baseURL='http://'.$baseURL; 
} 
$dom=new DomDocument(); 
$dom->loadHTML($content); 
$head = $dom->getElementsByTagName('head')->item(0); 
$base = $dom->createElement('base'); 
$base->setAttribute('href',$_GET['baseURL']); 

if ($head->hasChildNodes()) { 
    $head->insertBefore($base,$head->firstChild); 
} else { 
    $head->appendChild($base); 
} 

echo $dom->saveHTML(); 
?>