Вопрос

Я создал это регулярное выражение

(www|http://)[^ ]+

которые соответствуют каждому http://... или www.... но я не знаю, как создать preg_replace, который бы работал, я пробовал

preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);

но это не работает, результатом является пустая строка.

Это было полезно?

Решение

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

// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);

// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);

Другие советы

При использовании кодов регулярных выражений, предоставленных другими пользователями, обязательно добавьте флаг "i", чтобы включить нечувствительность к регистру, чтобы он работал как с HTTP://, так и с http://.Например, используя код chaos's:

preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);

Прежде всего, вам нужно экранировать — или, что еще лучше, заменить — разделители, как описано в других ответах.

preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);

Во-вторых, для дальнейшего улучшения регулярного выражения, $n заменяющий ссылочный синтаксис предпочтительнее, чем \\n, как указано в руководство пользователя.

preg_replace('~((www|http://)[^ ]+)~', '<a href="$1">$1</a>', $str);

В-третьих, вы напрасно используете захватывающие скобки, что только замедляет работу.Избавься от них.Не забудьте обновить $1 Для $0.На случай, если вам интересно, это не фиксирующие скобки: (?: ).

preg_replace('~(?:www|http://)[^ ]+~', '<a href="$0">$0</a>', $str);

Наконец, я бы заменил [^ ]+ с более коротким и точным \S, что является противоположностью \s.Обратите внимание , что [^ ]+ не допускает пробелов, но допускает перевод строк и табуляцию! \S не делает этого.

preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $str);

Ваша главная проблема, похоже, заключается в том, что вы заключаете все в круглые скобки, поэтому он не знает, что такое "\ 1".Кроме того, вам нужно экранировать символ "/".Так что попробуйте это:

preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);

Редактировать:На самом деле кажется, что скобки не были проблемой, я неправильно это истолковал.Побег все еще был проблемой, на что также указывали другие.Любое решение должно сработать.

preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);

Когда вы используете / в качестве разделителя вашего шаблона, имеющего / внутри вашего шаблона ничего хорошего не получится.Я решил это с помощью ! в качестве разделителя шаблона, но вместо этого вы могли бы использовать обратную косую черту.

Я также не видел никакой причины, по которой вы делали два родительских захвата, поэтому я удалил один из них.

Часть проблемы в вашей ситуации заключается в том, что вы работаете с подавленными предупреждениями;если бы у вас было error_reporting(E_ALL) вкл., вы бы увидели сообщения, которые PHP пытается сгенерировать о вашей проблеме с разделителем в вашем регулярном выражении.

Если в строке a содержится несколько URL-адресов, разделенных переносом строки вместо пробела, вы должны использовать \S

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top