Как заменить http:// или www с <href.. в PHP

Во время разработки добавление быстрого

assert False, value

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

7
задан Paolo Bergantino 4 July 2009 в 21:13
поделиться

5 ответов

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

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

// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);
14
ответ дан 6 December 2019 в 08:45
поделиться

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

preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);
2
ответ дан 6 December 2019 в 08:45
поделиться

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

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);
2
ответ дан 6 December 2019 в 08:45
поделиться

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

preg_replace ('/ (www | http: \ / \ / [^] +) /', ' \ 1 ', $ str);

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

1
ответ дан 6 December 2019 в 08:45
поделиться
preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);

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

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

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

1
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: