Как сделать все строки src глобальными в PHP?

Я пишу веб-браузер на PHP для устройств (таких как Kindle), которые не поддерживают просмотр с несколькими вкладками. В настоящее время я читаю исходный код страницы с помощью file_get_contents(), а затем повторяю его на странице. Моя проблема в том, что многие страницы используют локальные ссылки (например, ‹ img src='image.png>'), поэтому все они указывают на несуществующие страницы. Что я хочу сделать, так это найти все теги src и href и добавить полный веб-адрес к любому, который не начинается с «http://» или «https://». Как бы я это сделал?


person Skyler    schedule 02.10.2011    source источник
comment
Я считаю, что терминология, которую вы ищете здесь (и, скорее всего, даст вам больше правильных ответов), неотносительна. (Как сделать все строки src неотносительными в PHP? или что-то подобное)   -  person esqew    schedule 02.10.2011
comment
как бы вы правильно ссылались на URL-адреса изображений в удаленных файлах css?   -  person Lawrence Cherone    schedule 02.10.2011


Ответы (2)


добавить <base href="http://example.com/" />

в шапке страницы

это поможет вам вставьте его в раздел <head></head>

person elibyy    schedule 02.10.2011
comment
Спасибо. Я не мог использовать внутренний текст, потому что он возвращается не как элемент html, а как строка; вот что у меня есть: <?php $url = "http://www.example.com"; $str = file_get_contents($url); $matche = array(); $pos = str_replace("<head>", '<head>\n<base href="http://www.example.com" />', $str); echo $pos; ?> - person Skyler; 02.10.2011

Как elibyy предложил, я тоже рекомендовал бы использовать тег base. Вот способ сделать это с помощью DOMDocument PHP:

// example url
$url = 'http://example.com';
$doc = new DOMDocument();
$doc->loadHTMLFile( $url );

// first let's find out if there a base tag already
$baseElements = $doc->getElementsByTagName( 'base' );

// if so, skip this block
if( $baseElements->length < 1 )
{
    // no base tag found? let's create one
    $baseElement = $doc->createElement( 'base' );
    $baseElement->setAttribute( 'href', $url );
    $headElement = $doc->getElementsByTagName( 'head' )->item( 0 );
    $headElement->appendChild( $baseElement );
}

echo $doc->saveHTML();

Однако, сказав это; Вы уверены, что осознаете, насколько амбициозна ваша цель?

Например, я не думаю, что это именно то, что вам действительно нужно, поскольку ваше приложение в основном действует как прокси. Поэтому вы, вероятно, захотите направить, по крайней мере, все пользовательские ссылки через ваше приложение и вообще не направлять их напрямую к исходным ссылкам, потому что я предполагаю, что вы хотите, чтобы пользователь оставался в своем приложении с вкладками, а не прерывался. этого.

Что-то вроде:

http://yourapplication.com/resource.php?resource=http://example.com/some/path/

Теперь этого, конечно, можно было бы достичь, в основном делая то, что вы просили, и вместо того, чтобы добавлять к нему http:// или https://, добавляйте что-то такое, что приводит к URL-адресу из приведенного выше примера.

Однако как вы собираетесь различать, с какими ресурсами это можно сделать, а с какими нет? Если вы примените этот подход ко всем ресурсам на странице, ваше приложение быстро станет полноценным прокси-сервером, а значит, станет очень ресурсоемким.

Надеюсь, я дал вам краткий старт для некоторых вещей, чтобы принять во внимание.

person Decent Dabbler    schedule 02.10.2011
comment
Истинный. Я не думал об этом. Теперь у меня есть: ` ‹?php $url=$_GET[url]; $str = file_get_contents($url); $pos = str_replace(src=', src='.$url.'/', $str); $pos = str_replace('src=', 'src='.$url.'/', $pos); $pos = str_replace(href=', href='.$url.'/', $pos); $pos = str_replace('href=', 'href='.$url.'/', $pos); $pos = str_replace($url.'/http://', ​​'http://', ​​$pos); $pos = str_replace($url.'http://', ​​'http://', ​​$pos); $pos = str_replace($url.'http://, 'http://, $pos); эхо $pos; ?›` , но я не знаю, как на самом деле проксировать файлы, если они не html - что мне делать с изображениями? - person Skyler; 02.10.2011