Как заменить http: / / или www на
Я создал это регулярное выражение
(www|http://)[^ ]+
, что соответствует http://... или www.... но я не знаю как сделать подскажите, что будет работать, я пробовал
preg_replace('/((www|http://)[^ ]+)/', '<a href=""></a>', $str);
но это не сработает, результатом является пустая строка.
6 ответов
вам нужно избежать косых черт в регулярном выражении, потому что вы используете косые черты в качестве разделителя. В качестве разделителя можно также использовать другой символ.
// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href=""></a>', $str);
// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href=""></a>', $str);
при использовании кодов регулярных выражений, предоставленных другими пользователями, обязательно добавьте флаг "i", чтобы включить нечувствительность к регистру, поэтому он будет работать как с HTTP://, так и с http://. Например, используя код хаоса:
preg_replace('!(www|http://[^ ]+)!i', '<a href=""></a>', $str);
прежде всего, вам нужно избежать-или даже лучше, заменить-разделители, как описано в других ответах.
preg_replace('~((www|http://)[^ ]+)~', '<a href=""></a>', $str);
во-вторых, для дальнейшего улучшения выражения, в $n
замена ссылочного синтаксиса предпочтительнее \n
, как говорится в руководство.
preg_replace('~((www|http://)[^ ]+)~', '<a href=""></a>', $str);
в-третьих, вы напрасно используете захват скобок, что только замедляет процесс. Избавиться от них. Не забудьте обновить to
. В случае, если вы интересно, это не захватывающие скобки:
(?: )
.
preg_replace('~(?:www|http://)[^ ]+~', '<a href=""></a>', $str);
наконец, я бы заменил [^ ]+
С более коротким и более точным \S
, что противоположно \s
. Обратите внимание, что [^ ]+
не разрешает пробелы, но принимает новые строки и вкладки! \S
нет.
preg_replace('~(?:www|http://)\S+~', '<a href=""></a>', $str);
ваша главная проблема заключается в том, что вы все ставите в скобки, поэтому он не знает, что такое "\1". Кроме того, вам нужно избежать "/". Поэтому попробуйте следующее:
preg_replace('/(www|http:\/\/[^ ]+)/', '<a href=""></a>', $str);
Edit: на самом деле кажется, что скобки не были проблемой, я неправильно ее понял. Побег по-прежнему остается проблемой, как указывали и другие. Любое решение должно работать.
preg_replace('!((?:www|http://)[^ ]+)!', '<a href=""></a>', $str);
при использовании /
как ваш разделитель шаблона, имеющий /
внутри вашего шаблона не будет работать хорошо. Я решил это, используя !
в качестве разделителя шаблонов, но вы можете избежать своих косых черт с обратными косыми чертами.
Я также не видел никакой причины, почему вы делали два захвата paren, поэтому я удалил один из них.
часть проблемы в вашей ситуации заключается в том, что вы бежите с подавленными предупреждениями; если бы вы error_reporting(E_ALL)
on, вы бы видел сообщения, которые PHP пытается создать о вашей проблеме с разделителем в вашем регулярном выражении.
Если в строке a содержится несколько url-адресов, разделенных разрывом строки вместо пробела, вы должны использовать \s
preg_replace('/((www|http:\/\/)\S+)/', '<a href=""></a>', $val);