#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, что прерывает ссылку. Это понятнее? Изображение не имеет значения. Я просто пытался объяснить, что это регулярное выражение уже делало.