За последние 24 часа нас посетил 19061 программист и 1614 роботов. Сейчас ищут 649 программистов ...

Относительные url в абсолютные

Тема в разделе "Регулярные выражения", создана пользователем dwight, 26 авг 2010.

  1. dwight

    dwight Активный пользователь

    С нами с:
    26 авг 2010
    Сообщения:
    6
    Симпатии:
    0
    Доброго времени суток!
    Очень нужна помощь!

    Есть строка - html-код. Требуется относительные ссылки перевести в абсолютные(для отправки на мыло).

    Примерный алгоритм мне представился в следующем виде:
    1. Ищем строку href=" (могут быть пробелы или переносы);
    2. Если после найденной строки НЕ идёт текст вроде http:// https:// ftp:// mailto:
    - то это относительный url.
    3. Если url относительный, меняем href=" на href="www.site.ru/

    Думаю нужно использовать функцию preg_replace.
    Пытался сам собрать регэксп - получилось чтото вроде
    Код (Text):
    1.  
    2. preg_replace('/href\s*=\s*\"[^(http:\/\/|https:\/\/|ftp:\/\/|mailto:)]/', '/href\s*=\s*\"www.site.ru\//', $str);
    - не работает, я нуб в регэкспах - ПОЖАЛУЙСТА, ПОМОГИТЕ!
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Группа литералов указывает не на упорядоченный набор, а на группу селекторов, по которым будет детерменирована строка.
     
  3. dwight

    dwight Активный пользователь

    С нами с:
    26 авг 2010
    Сообщения:
    6
    Симпатии:
    0
    Спасибо за ответ, но мне это не о чём не говорит(. Можешь на примере обьяснить, плизз? Или подсказать решение?
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Та да, бомбанул как на экзамене)
     
  5. dwight

    dwight Активный пользователь

    С нами с:
    26 авг 2010
    Сообщения:
    6
    Симпатии:
    0
    Ну что никто не поможет?

    Нашел такую вещь http://regexpres.narod.ru/calculator.html

    Ввожу:

    Регулярное выражение
    Код (Text):
    1. href=\"(?!http\/\/:|https\/\/:)
    Заменить (снизу выбрать replace)
    Код (Text):
    1. href="www.site.ru/
    Всё работает как надо!

    НО! не могу заставить тоже саме работать в php:
    Код (Text):
    1.  
    2.     $str = 'href="blabla';
    3.     str_replace('/href=\"(?!http\/\/:|https\/\/:)/','href="www.site.ru',$str);
    4.     echo $str;
    Выводит строку без изменений..
    Помогите плз, срочно нужно!!!
     
  6. dwight

    dwight Активный пользователь

    С нами с:
    26 авг 2010
    Сообщения:
    6
    Симпатии:
    0
    Всем спасибо! Разобрался сам!!!!

    Вдруг кому пригодится:

    Код (Text):
    1.  
    2. $string = 'любой html код';
    3. $pattern = array('/href\s*=\s*\"\s*(?!http:\/\/|https:\/\/|ftp:\/\/|mailto:)/','/src\s*=\s*\"\s*(?!http:\/\/|https:\/\/|ftp:\/\/)/');
    4. $replacement = array('href="http://site.ru/','src="http://site.ru/');
    5. echo preg_replace($pattern, $replacement, $string);
    Итак, здесь выводится строка string, но все относительные пути для картинок и ссылок конвертируются в абсолютные (домен нужный впишите).
    Единственное - путь в ссылках/картинках должен быть заключён в такие "" кавычки.
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    dwight
    Садись, два! (с)
    Протокол передачи фиксирован, это плохо.
    Правь логику, чтобы проверяла сначала наличие любого протокола, других проверок не нужно. Тем более указывать отдельно href и src.
     
  8. dwight

    dwight Активный пользователь

    С нами с:
    26 авг 2010
    Сообщения:
    6
    Симпатии:
    0
    Раз уж Вы в этом так разбираетесь, может предложите реальную помощь?
    Проверка наличия любого протокола - примерно понятно:
    Код (Text):
    1. /\w{3,8}:\/\//
    А вот как сделать чтобы href меняло на href, a src на src в одном выражении - я не знаю...
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    dwight
    У меня есть два пути: дать готовое решение и этим самым опустить вас с вашей недоделанной квалификацией (образно) или действительно помочь разобраться, указывая на ошибки. Второй способ заставляет думать и учиться, первый способ - жить за чужой счет на готовом. Если я дам вам регулярное выражение, то никаких пояснений больше не ждите.

    Дам вам время подумать до вечера, потом напишу регулярное выражение =)
     
  10. dwight

    dwight Активный пользователь

    С нами с:
    26 авг 2010
    Сообщения:
    6
    Симпатии:
    0
    Apple
    Согласен, это правильная позиция.
    Только пока представить не могу, как обойтись без массивов...