Регулярное выражение для ссылок без точки в конце - PullRequest
1 голос
/ 26 апреля 2019

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

Эти тексты выглядят примерно так:

Example text... https://example.com/site. More text here...

Проблема в том, что это не ссылка на какую-либо веб-страницу. С помощью этого вопроса я сделал эту функцию PHP:

function modifyText($text) {
    $url = '/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';
    $string= preg_replace($url, '<a href="$0" target="_blank">$0</a>', $text);
    return $string;
}

В приведенном выше примере этот код генерирует

Example text... <a href="https://example.com/site." target="_blank">https://example.com/site.</a> More text here...

но это должно сгенерировать

Example text... <a href="https://example.com/site" target="_blank">https://example.com/site</a>. More text here...

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Другой вариант - использовать отрицательный вид сзади (?<!\.) после \S, чтобы утверждать, что слева не точка:

https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}(?:\/\S*(?<!\.))?

Regex demo | Php demo

Если вам не нужны группы захвата (), вы можете превратить их в группы без захвата (?:)

Вам не нужно бежатькосая черта \/, если вы используете другой разделитель , чем /, например, ~

Например:

function modifyText($text) {
    $url = '~https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}(?:\/\S*(?<!\.))?~';
    $string= preg_replace($url, '<a href="$0" target="_blank">$0</a>', $text);
    return $string;
}

echo modifyText("Example text... https://example.com/site. More text here... https://example.com/site");

Результат

Example text... <a href="https://example.com/site" target="_blank">https://example.com/site</a>. More text here... <a href="https://example.com/site" target="_blank">https://example.com/site</a>
1 голос
/ 26 апреля 2019

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

'/https?:\/\/[a-z0-9.-]+\.[a-z]{2,3}(\/\S*?(?=\.*(?:\s|$)))?/i'

https://regex101.com/r/4VEWjW/2

Может также повторять точки, за которыми следуют не точки, чтобы не быть ленивым:

'/https?:\/\/[a-z0-9.-]+\.[a-z]{2,3}(\/\.*[^.]+(?=\.*(?:\s|$)))?/i'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...