Как предотвратить образование слипшихся ссылок?

Привет всем! У меня есть <b>регулярное выражение</b>, которое проверяет <b>валидность ссылок</b>. Вкратце, оно должно выполнять следующие задачи: <br/> <br/> 1. Допускать одиночные ссылки. <br/> 2. Допускать несколько ссылок, разделённых точкой с запятой и пробелом. <br/> 3. Не допускать слипшиеся ссылки (например, www.example1.comwww.example2.com). <br/> 4. Убедиться, что ссылки начинаются с http, https или www. <br/> <br/> <b>Однако у меня возникла проблема с третьим пунктом:</b> <br/> Регулярное выражение не распознаёт слипшиеся ссылки, начинающиеся с http или https, но допускает такие ссылки, начинающиеся с www (как это указано в третьем пункте). Я пытался исправить ситуацию, добавив обязательные слеш или знак вопроса после домена (чтобы учесть query-параметры). Однако теперь регулярное выражение валидирует ссылки только в случае, если после домена присутствует слеш или знак вопроса. <br/> <br/> <b>Вопрос: Как можно изменить регулярное выражение так, чтобы после домена могли следовать только слеш или знак вопроса, при этом учитывая, что ссылка должна быть валидной даже в случае, если после домена ничего не указано?</b> <br/> <br/> Вот само регулярное выражение: <br/> <br/> /^(https?:\/\/|www\.)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}(\/|\?)([\/\w .-]*)?(#[\w-]*)?(\?.*)?(; (https?:\/\/|www\.)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}(\/|\?)([\/\w .-]*)?(#[\w-]*)?(\?.*)?)*$/
  • 25 сентября 2024 г. 16:03
Ответы на вопрос 2
Чтобы решить вашу задачу и сделать регулярное выражение более гибким, позволяя ссылкам быть валидными и без обязательного символа слэша или вопросительного знака после домена, можно внести несколько изменений. Мы добавим возможность, чтобы после домена могли следовать не только слэш или вопросительный знак, но и ничего вообще, с тем чтобы соответствовать вашим требованиям. Вот улучшенное регулярное выражение:

```regex
/^(https?:\/\/|www\.)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}(\/|\?|$)([\/\w .-]*)?(#[\w-]*)?(\?.*)?(; (https?:\/\/|www\.)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}(\/|\?|$)([\/\w .-]*)?(#[\w-]*)?(\?.*)?)*$/
```

### Объяснение изменений:

1. **Меняем `(\/|\?)` на `(\/|\?|$)`**: 
   - Мы добавили `$` (конец строки) в качестве альтернативы. Это позволит ссылке быть валидной даже в случае, если после домена ничего не указано. То есть, ссылки будут также валидными в следующих случаях:
     - `http://example.com`
     - `https://example.com`
     - `www.example.com`
     - `http://example.com/`
     - `https://example.com?query=value`

2. **Сохраняя логику для других ссылок**: Изменения позволяют вам использовать любое количество ссылок, разделённых `; `.

Теперь ваше регулярное выражение будет учитывать как валидные ссылки с пустым окончанием, так и те, которые продолжаются с `/` или `?`. Это позволит избежать ситуации со слипшимися ссылками, как вы и хотели.
^(?:^https?\:\/\/)?(?:www\.)?[a-z0-9-]+\.[a-z]+(?:[?\/].*)?$

проверка
Похожие вопросы