Как разобрать точку в конце URL-адреса в предложении?

#php #regex

#php #регулярное выражение

Вопрос:

Вот что у меня есть на данный момент:

 /(^|s)(http://(S )(?!(.png|.gif|.jpg)($|.s|.$|s)))($|.s|.$|s)/i
  

И я заменяю его вот так:

 '$1<a href="$2">$2</a>$6'
  

Иногда мои пользователи вводят что-то вроде этого: http://google.com . <- Как мне избежать включения этой последней точки без разбора других периодов, которые есть в URL-адресах?

Кроме того, на случай, если вам интересно, для чего предназначен файл .gif .png и т.д., я разбираю изображения для автоматического создания элементов.

Редактировать: Это для PHP.

Это для форума, где пользователи публикуют множество вещей, включая ссылки. Он успешно обрабатывает любую ситуацию, за исключением знаков препинания после URL-адреса.

Правка 2: Возможно, слово «Разобрать» неверно. Я не пытаюсь убрать знаки препинания, просто отделяю их от URL, чтобы я мог отобразить рабочую ссылку моим пользователям.

Правка 3: http://daringfireball.net/2010/07/improved_regex_for_matching_urls Я еще не провел полное тестирование, но, похоже, это работает. Я сделаю это решением после того, как протестирую. Или, если кто-то еще хочет получить баллы, не стесняйтесь протестировать, и я проголосую за ваше решение.

Комментарии:

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

Ответ №1:

Итак, обновленное решение:

 /b(http://(S (?<!.)(?=(?:$|s|.(?:$|s)))))(?<!(?:.(?:png|gif|jpg)))/i
  

Смотрите это здесь онлайн в Regexr

Я заменил ваше (^|s) на b thats a word boundary, это именно то, что вы хотите здесь.

На ваш (S ) я изменил на (S (?<!.)(?=(?:$|s|.(?:$|s)))) . По сути, я сопоставляю все пробелы, не содержащие пробелов, до тех пор, пока не появится $|s|.(?:$|s) впереди и не исчезнет точка слева ( (?<!.) часть).

Следующий обзор должен быть взглядом за.

Затем я немного убрал ваши скобки и чередования и использовал некоторые группы, не захватывающие (группы, начинающиеся с (?: )

Итак, для вашей тестовой строки users type something like this: http://google.com. <- How do I avoid она будет совпадать http://google.com с этим в первой группе и google.com во второй группе.

Комментарии:

1. Мне нравятся многие из этих изменений, но это приводит к сбою, когда в строке более одного URL-адреса. Он сохраняет второй URL в виде строки (которую мой оригинал обработал правильно).

2. @Stephane Итак, сбой произошел не на нескольких URL-адресах, а на URL-адресах без точки в конце. Исправлено регулярное выражение и обновлена ссылка Regexr. Теперь немного сложнее.

Ответ №2:

Решение PHP:

 $line = 'http://www.google.com.';

echo preg_replace(
    "/(s*)((http://)?(S ?(.png|.gif|.jpg)?))(W*)$/i", 
    '$1<a href="$2">$2</a>$6', 
    $line), "n";
  

Комментарии:

1. Я использую это для замены URL-адресов ссылками в PHP. Я не хочу ничего удалять.

2. Хорошо, но можете ли вы сопоставить и создать ссылку из того, что я печатаю прямо сейчас google.com . Это не всегда в конце! Stackoverflow выполняет это правильно!

3. Он по-прежнему работает некорректно. Вот тестовая строка: google.com . И google.png . И google.com (ТАК же как и удаление http://

4. Вы перемещаете сообщения о целях. Не могли бы вы лучше оформить свои тестовые примеры и ожидаемые результаты? Например, что, по вашим ожиданиям, произойдет, когда пользователь создаст ссылку на google.png? Предполагается ли, что ваш код должен знать, является ли .png допустимым TLD; Вы хотите, чтобы он вставлял «http: //», когда он отсутствует?; и т.д.

5. Извините. (и спасибо) Я хочу, чтобы любое количество URL-адресов было заменено якорями, даже если есть знаки препинания в конце. Прямо сейчас у меня это так, что он ищет пробелы, и это работает нормально, но у меня было несколько пользователей, использующих URL-адреса в предложениях, и конечная точка включается в href, что прерывает ссылку. Это понятнее? Изображение не имеет значения. Я просто пытался объяснить, что это регулярное выражение уже делало.