Nano Hash - криптовалюты, майнинг, программирование

URL-адрес PHP для связи с регулярным выражением

Я знаю, что видел много такого, но мне нужно что-то немного более необычное, чем обычно. К сожалению, когда я ищу это где угодно, он оказывается похороненным в сообщениях о том, что просто превращаю ссылку в ссылку на HTML-тег. Я хочу, чтобы функция PHP удаляла «http: //» и «https: //» из ссылки, а также все, что находится после. *, Поэтому в основном то, что я ищу, - это превратить A в B.

A: http://www.youtube.com/watch?v=spsnQWtsUFM
B: <a href="http://www.youtube.com/watch?v=spsnQWtsUFM">www.youtube.com</a>

Если это поможет, вот моя текущая функция замены регулярного выражения PHP.

ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\" class=\"bwl\" target=\"_new\">\\0</a>", htmlspecialchars($body, ENT_QUOTES)));

Возможно, было бы также полезно сказать, что я абсолютно не разбираюсь в регулярных выражениях. Спасибо!

РЕДАКТИРОВАТЬ: Когда я ввел такой комментарий blahblah https://www.facebook.com/?sk=ff&ap=1 blah, я получил html, подобный этому<a class="bwl" href="blahblah https://www.facebook.com/?sk=ff&amp;ap=1 blah">www.facebook.com</a>, который вообще не работает, поскольку он берет с собой текст вокруг ссылки. Однако он отлично работает, если кто-то только комментирует ссылку. Это когда я изменил функцию на эту

preg_replace("#^(.*)//(.*)/(.*)$#",'<a class="bwl" href="\0">\2</a>',  htmlspecialchars($body, ENT_QUOTES));


Ответы:


1

Это самый простой и понятный способ:

$str = 'http://www.youtube.com/watch?v=spsnQWtsUFM';
preg_match("#//(.+?)/#", $str, $matches);

$site_url = $matches[1];

РЕДАКТИРОВАТЬ: Я предполагаю, что $ str изначально был проверен как URL-адрес, поэтому я оставил это. Кроме того, я предполагаю, что все URL-адреса будут содержать «http: //» или «https: //». Если URL-адрес имеет такой формат www.youtube.com/watch?v=spsnQWtsUFM или даже youtube.com/watch?v=spsnQWtsUFM, указанное выше регулярное выражение не будет работать!

EDIT2: извините, я не понял, что вы пытались заменить все строки во всем тесте. В этом случае это должно работать так, как вы хотите:

$str = preg_replace('#(\A|[^=\]\'"a-zA-Z0-9])(http[s]?://(.+?)/[^()<>\s]+)#i', '\\1<a href="\\2">\\3</a>', $str);
18.06.2011
  • это также будет соответствовать ftp: // ... :) 18.06.2011
  • @Tudor Constantin: Да, я только что отредактировал его, чтобы сказать, что с помощью этой функции я предполагаю, что ранее он был проверен на действительный URL. 18.06.2011
  • Кажется, у вас не работает то, что я пытаюсь сделать, так как я пытаюсь заменить все ссылки в комментарии пользователя, чтобы он просто отображал 1 18.06.2011
  • Я не понимал, что $ str - это фрагмент текста, а не только подтвержденный URL. Я также не понимал, что вы хотите заменить все. Я обновил код. Должен работать как шарм. 18.06.2011
  • Да, похоже, что он полностью работает даже с несколькими ссылками! большое спасибо за это :) 18.06.2011
  • Я считаю, что ваша производительность была бы лучше, если бы вы заменили (.+?) на [^/]+ 18.06.2011
  • Мое решение: stackoverflow.com/questions/17900004/ 28.07.2013

  • 2

    Я тоже не специалист по регулярным выражениям,

    ^(.*)//(.*)/(.*)$
    <a href="\1//\2/\3">\2</a>
    

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

    ^ (. ) // должен извлечь протокол - обозначенный как \ 1 во второй строке. (.) / должен извлекать все до первого / - обозначенного как \ 2 во второй строке. (. *) $ захватывает все до конца строки. - обозначается как \ 3 во второй строке.


    Добавлено позже

    ^(.*)( )(.*)//(.*)/(.*)( )(.*)$
    \1\2<a href="\3//\4/\5">\4</a> \7
    

    Это должно быть немного лучше, но заменит только 1 URL

    18.06.2011
  • Это будет работать нормально (если перед вызовом этого URL проверяется действительный URL-адрес). В качестве правильного PHP это будет preg_replace (# ^ (. *) // (. *) / (. *) $ #, '‹A href=\0› \ 2 ‹/a›', $ str), где \ 0 - это вся совпавшая строка. 18.06.2011
  • @stumpx: я не уверен, почему вы выбрали этот ответ как правильный, но после того, как вы поняли, что в вашей ситуации 1) значение $ str не было проверено на действительный URL-адрес и 2) вы хотите заменить ВСЕ URL-адреса в $ str, этот код вообще не будет работать так, как вы хотите. Во-первых, он будет работать не только со ссылками http (s), но и с ftp (s) или irc (например). Кроме того, он вернет ТОЛЬКО ссылку в формате HTML последней появившейся ссылки в $ str, а не остальную часть строки (в любой форме или форме). 18.06.2011
  • На самом деле это не сработало. Когда я ввел такой комментарий blahblah https://www.facebook.com/?sk=ff&ap=1 blah, я получил такой html <a class="bwl" href="Links dont work https:">www.facebook.com</a>, который вообще не работает. Он отлично работает, если кто-то только комментирует ссылку. 18.06.2011
  • Итак, у вас есть URL-адрес внутри комментария ... Я разместил выражение, предполагая, что в строке был только URL-адрес. В этом случае попробуйте найти '^ (. *) () (. *) // (. *) / (. *) () (. *) $' '\ 1 \ 2 ‹a href = \ 3 // \ 4 / \ 5 ›\ 4 ‹/a› \ 7 'Это должно быть немного лучше, но заменит только 1 URL. 18.06.2011

  • 3

    \ 0 заменяется всей совпадающей строкой, тогда как \ x (где x - это число, отличное от 0, начиная с 1) будет заменено каждой подчастью вашей совпадающей строки в зависимости от того, что вы заключили в круглые скобки, и порядка появления этих групп. . Ваше решение выглядит следующим образом:

    ereg_replace("[[:alpha:]]+://([^<>[:space:]]+[:alnum:]*)[[:alnum:]/]", "<a href=\"\\0\" class=\"bwl\" target=\"_new\">\\1</a>
    

    Я не смог это проверить, поэтому дайте мне знать, работает ли это.

    18.06.2011
  • Эта функция исключена в PHP 5.3.0. Было бы неразумно использовать эту функцию больше. Кроме того, выражение намного сложнее, чем должно быть. 18.06.2011
  • Это, похоже, не сработало, на самом деле он просто использовал всю ссылку, и изменение числа на 2 дало мне просто 2 на выходе 18.06.2011
  • Ах, я даже не видел твоего первого комментария, хотя спасибо за объяснение, я даже не осознавал 18.06.2011

  • 4

    Я думаю, это должно сработать (я не тестировал):

    preg_match('/^http[s]?:\/\/(.+?)\/.*/i', $main_url, $matches);
    $final_url = '<a href="'.$main_url.'">'.$matches[1].'</a>';
    
    18.06.2011
  • Это не будет работать со ссылками https. Кроме того, может не быть необходимости проверять, является ли это URL-адресом в первую очередь, поэтому последняя часть регулярного выражения (/.*) действительно не нужна. Наконец, поскольку косая черта так интенсивно используется в выражении, было бы разумнее использовать другой разделитель выражений, например; или #. 18.06.2011

  • 5

    Я удивлен, что никто не помнит функцию PHP parse_url:

    $url = 'http://www.youtube.com/watch?v=spsnQWtsUFM';
    echo parse_url($url, PHP_URL_HOST); // displays "www.youtube.com"
    

    Я думаю, ты знаешь, что делать оттуда.

    18.06.2011
  • Конечно ... вроде забыл об этом. Полагаю, я привык к preg_match / preg_replace x). В любом случае для parse_url потребуется гораздо больше строк кода. Я не знаю, как он будет сравниваться с preg_replace, но я предполагаю, что, учитывая тот факт, что PHP должен создавать массивы, и вам, вероятно, нужно использовать preg_match_all для получения всех URL-адресов в тексте в первую очередь, это не собираюсь превзойти функцию preg_replace. 18.06.2011
  • Да, сначала я не понял, что он выполняет поиск и замену в документе. Я думал, он просто обрабатывает один URL .... 18.06.2011

  • 6

    Код с регулярным выражением не работает полностью.

    Я сделал этот код. Он гораздо более всеобъемлющий, но он работает:

    См. Результат здесь: http://cht.dk/data/php-scripts/inc_functions_links.php

    См. Исходный код здесь: http://cht.dk/data/php-scripts/inc_functions_links.txt

    11.11.2013

    7
  • ereg_replace исключен из PHP 5.3.0. Было бы неразумно использовать эту функцию сейчас. 18.06.2011
  • @ Battle_707, вы правы, я был в режиме автопилота и просто использовал ту же функцию, что и плакат, не задумываясь об этом. Вместо этого я обновил свой ответ с preg. 20.06.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..