Замена относительных ссылок в тексте html на абсолютные

Тема в разделе "PHP", создана пользователем nexus-invest, 7 апр 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. nexus-invest

    nexus-invest Создатель

    Регистр.:
    18 сен 2008
    Сообщения:
    25
    Симпатии:
    3
    Здравствуйте!
    Имеется база данных, в которой хранится html текст, который содержит относительные ссылки!
    Так вот, как сделать так, чтобы все эти отностительные ссылки заменить на абсолютные?!!
    Пробовал так
    PHP:
    $domain 'http://test.ru';
    $data preg_replace('#<img src\=([a-zA-Z\.\/\-\_]+)>#'"<img src=$domain/\\1>"$data);
    Но что-то не получается! Помогите разобраться!
    Уж больно не хочется вручную все править!!!!:)
     
  2. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Не надо экранировать символы внутри квадратных скобок.
    Или я уже туплю в конце рабочего дня...
     
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    PHP:
        function _expandlinks($links,$URI)
        {
            
            
    preg_match("/^[^\?]+/",$URI,$match);

            
    $match preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
            
    $match preg_replace("|/$|","",$match);
            
    $match_part parse_url($match);
            
    $match_root =
            
    $match_part["scheme"]."://".$match_part["host"];
                    
            
    $search = array(     "|^http://".preg_quote($this->host)."|i",
                                
    "|^(\/)|i",
                                
    "|^(?!http://)(?!mailto:)|i",
                                
    "|/\./|",
                                
    "|/[^\/]+/\.\./|"
                            
    );
                            
            
    $replace = array(    "",
                                
    $match_root."/",
                                
    $match."/",
                                
    "/",
                                
    "/"
                            
    );            
                    
            
    $expandedLinks preg_replace($search,$replace,$links);

            return 
    $expandedLinks;
        }
     
  4. nexus-invest

    nexus-invest Создатель

    Регистр.:
    18 сен 2008
    Сообщения:
    25
    Симпатии:
    3
    Прошу прощения! Но не могли бы Вы рассказать, как работает эта функция! А то я в регулярных выражениях, мягко говоря, не силен!!!:)

    Какие параметры необходимо передать этой функции?!
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Первый параметр - ссылка или массив ссылок, которые надо преобразовать к абсолютным. Второй параметр - это абсолютный урл, относительно которого те самые ссылки являются относительными.

    Т.е. ссылка вида '../file.txt' относительно урла 'http://site.com/data/links.htm' преобразуется в 'http://site.com/file.txt'
    Надеюсь, понятно.

    Там в коде еще затесался $this->host. Замени его там на что-то вменяемое. По смыслу это должен быть
    PHP:
      $arr parse_url($URI);
      
    $this_host $arr['host'];
     
  6. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    А может проще?
    PHP:
    $html=str_replace('<img src="','<img src="http://domain.com',$html); 
     
  7. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Можно и проще, но ссылки бывают трех видов: от корня, от текущего места, и от http://. И если ко всем из них дописать в начало http://domain.com - будет лажа. Типа такой: <img src="http://domain.comhttp://youtube.com/yimg/0232143.jpg">

    И как правило на одной и той же странице часть картинок с "полными" урлами, а часть - с относительными.
     
  8. _axl

    _axl Постоялец

    Регистр.:
    24 сен 2008
    Сообщения:
    50
    Симпатии:
    8
    если ссылка с http:// то она и так абсолютная, а если будет от корня тогда перед ссылкой будет /, вообщем, код сообщением выше можно доделать так:
    PHP:
    $address 'src="http://hahahaha"';

    if(  
    stristr$address'src="http://') === FALSE )

        if( 
    stristr$address'src="/') !== FALSE )
        {
            
    $address str_replace('src="/''src="http://site.ru/'$address);
        }
        else
        {
            
    $address str_replace('src="''src="http://site.ru/'$address);
        }
        
     
Статус темы:
Закрыта.