-
Суть задачи:
скрипт выкачивает файл откуда-то и парсит все ссылки
($buffer - весь возвратившийся от того сайта HTML код)
preg_match_all("||U",$buffer,$regs,PREG_SET_ORDER);
for($i=0;$i {
if(substr($regs[$i][2],0,7)!="http://")
{
if(substr($regs[$i][2],0,1)!="/")
{
$h="$url2/".$regs[$i][2];
$buffer=str_replace($regs[$i][2],$h,$buffer);
print "
WAS -- ".$regs[$i][2].";
NOW -- $h";
}
}
}
Всё бы хоршо а вот если ссылка встречается в файле более 1 раза то появляются такие фишки: http://server/http://server/somefile
Как от этого избавиьтся может кто сталкивался ХЕЛП :)
-
Я бы немного переделал
preg_match_all("||U", $buffer, $regs);
$regs[2] = array_unique($regs[2]);
$regs[2] = array_values($regs[2]);
for($i=0;$i < sizeof($regs[2]);$i++) {
if(substr($regs[2][$i],0,7)!="http://")
{
if(substr($regs[2][$i],0,1)!="/")
{
$h="$url2/".$regs[2][$i];
$buffer=str_replace($regs[2][$i],$h,$buffer);
print "
WAS -- ".$regs[2][$i].";
NOW -- $h";
}
}
}
-
AlieN
А это не поможет?
http://php.spb.ru/php/url.html
-
вообще для html-парсинга есть библиотека htmlparser =>
http://anton.concord.ru/
Насчет твоей ситуации то проблема вероятно в str_replace() - он ведь все вхождения заменяет. Можно preg_replace() использовать, только limit=1 укажи .
-
Макс
ИМХО, htmlparser\'ом изменять ссылки - это из серии пушкой по воробьям. Parser - вещь хорошая, но уж слишком громоздкая. Так, например, чтобы изменить все ссылки на данной странице, потребовалось 2.2778771 сек. Все же многовато.
Вот сам тест (если кто не верит)
require "parser/htmlparser.inc";
require "parser/common.inc";
$p=new HtmlParser("index.htm",unserialize(Read_File("htmlgrammar.cmp")),"index.htm",1);
$p->parse();
ChangeLinks(&$p->content);
GetPageSrc(&$p->content,&$src);
function ChangeLinks($c) {
for ($i = 0; $i <= $c[\'contentpos\']; $i++) {
if ($c[$i][\'type\'] == "tag" && $c[$i][\'data\'][\'type\'] == "open") {
if ($c[$i][\'data\'][\'name\'] == "a" && $c[$i][\'pars\'][\'href\']) {
if (substr($c[$i][\'pars\'][\'href\'][\'value\'], 0, 7)!="http://" && $c[$i][\'pars\'][\'href\'][\'value\'][0] !="/") {
$c[$i][\'pars\'][\'href\'][\'value\'] = "http://myserver.com/".$c[$i][\'pars\'][\'href\'][\'value\'];
}
}
}
if ($c[$i][\'content\']) ChangeLinks(&$c[$i][\'content\']);
}
return $c;
}
-
Ну и что делать-то?
preg_replace выдает ошибку:
Warning: Delimiter must not be alphanumeric or backslash in /usr/local/apache/htdocs/catalog/mail/index.phtml on line 144
Вот код:
preg_match_all("||U",$buffer,$regs,PREG_SET_ORDER);
$regs[2] = array_unique($regs[2]);
$regs[2] = array_values($regs[2]);
for($i=0;$i {
if(substr($regs[$i][2],0,7)!="http://")
{
if(substr($regs[$i][2],0,1)!="/")
{
$h="$url2/".$regs[$i][2];
preg_replace(str_replace("\\\\","\\\\\\\\",$regs[$i][2]),str_replace("\\\\","\\\\\\\\",$h),$buffer);
print "
WAS -- ".$regs[$i][2]."
NOW -- $h";
}
}
}
-
Попробуй сменить delmiter в regexp\'е на / или букву, либо цифру.
(.*)[Hh][Rr][Ee][Ff]=
для этого есть модификатор i
И убериPREG_SET_ORDER
-
Ой ё. Этого не заметил
preg_replace(str_replace("\\","",$regs[$i][2]),str_replace("","",$h),$buffer);
Зачем тебе preg_replace нужен?
Посмотри выше, я тебе там привел рабочий пример.
-
GotZfild
твой пример что-то совсем не пашет
-
У меня пашет
Вот протестил:
$buffer = \'
линк
линк еще линк - - два
линк
и еще
\';
preg_match_all("||U", $buffer, $regs);
$regs[2] = array_unique($regs[2]);
$regs[2] = array_values($regs[2]);
$url2 = "http://new_domen";
for($i=0;$i < sizeof($regs[2]);$i++) {
if(substr($regs[2][$i],0,7)!="http://")
{
if(substr($regs[2][$i],0,1)!="/")
{
$h="$url2/".$regs[2][$i];
$buffer=str_replace($regs[2][$i],$h,$buffer);
print "
WAS -- ".$regs[2][$i].";
NOW -- $h";
}
}
}
echo "".htmlspecialchars($buffer);
Вывел
WAS -- another.htm;
NOW -- [url]http://new_domen/another.htm[/url]
WAS -- page2.htm;
NOW -- [url]http://new_domen/page2.htm[/url]
линк
линк еще линк - - два
линк
и еще
-
GotZfild
спасибаЧЧки, после небольшой доработки:
preg_match_all("||U", $buffer, $regs);
$regs[2] = array_unique($regs[2]);
$regs[2] = array_values($regs[2]);
for($i=0;$i < sizeof($regs[2]);$i++)
{
if(substr($regs[2][$i],0,7)!="http://")
{
if(substr($regs[2][$i],0,1)!="/")
{
$h="$url2/".$regs[2][$i];
$buffer=str_replace($regs[2][$i],$h,$buffer);
}
if(substr($regs[2][$i],0,1)=="/")
{
$h="$url1".$regs[2][$i];
$buffer=str_replace($regs[2][$i],$h,$buffer);
}
}
}
Всё заработало идеально