Pergunta

Eu criei este regex

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

que correspondem a cada http: // ... ou www .... , mas não sei como fazer preg_replace que iria trabalhar, eu tentei

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

mas não trabalho, o resultado é uma string vazia.

Foi útil?

Solução

Você precisa escapar as barras no regex porque você está usando barras como delimitador. Você também pode usar um símbolo como delimitador.

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

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

Outras dicas

Ao usar os códigos regex fornecidos pelos outros usuários, certifique-se de adicionar o "i" bandeira para permitir caso insensibilidade, por isso vai trabalhar tanto com http: // e http: //. Por exemplo, usando o código de caos:

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

Em primeiro lugar, você precisa escapar, ou ainda melhor, substitua-os delimitadores como explicado em outras respostas.

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

Em segundo lugar, para melhorar ainda mais a expressão regular, a sintaxe de referência substituição $n é preferido em relação \\n, como indicado na manual do .

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

Em terceiro lugar, você está desnecessariamente o uso de parênteses de captura, que só atrasa as coisas. Livrar-se deles. Não se esqueça de atualizar $1 para $0. No caso você esteja se perguntando, estes são parênteses não captura: (?: )

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

Finalmente, gostaria de substituir [^ ]+ com o \S mais curto e mais preciso, que é o oposto do \s. Note-se que [^ ]+ não permite espaços, mas aceita novas linhas e tabs! \S não.

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

O seu principal problema parece ser que você está colocando tudo em parênteses, para que ele não sabe o que "\ 1" é. Além disso, você precisa escapar da "/". Então tente o seguinte:

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

Edit: Na verdade, parece que os parênteses não fosse um problema, eu descaracterizou-lo. O escapando ainda era um problema como outros também apontou. De qualquer solução deve funcionar.

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

Quando você usa / como seu padrão delimitador, tendo / dentro do seu padrão não vai funcionar bem. Eu resolvi isso usando ! como delimitador padrão, mas você pode escapar de seus golpes com barras invertidas em vez.

Eu também não vejo nenhuma razão pela qual você estava fazendo dois paren capta, assim que eu removi um deles.

Parte do problema em sua situação é que você está correndo com avisos suprimidos; se você tivesse error_reporting(E_ALL), você teria visto as mensagens PHP está tentando gerar sobre o seu problema delimitador na sua regex.

Se houver múltiplos url contida em uma corda um separado por uma quebra de linha em vez de um espaço, você tem que usar o \ S

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top