Pregunta

He creado esta expresión regular

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

que coincida con todos los http: // ... o www .... pero no sé cómo hacer que funcione preg_replace, lo he intentado

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

pero no funciona, el resultado es una cadena vacía.

¿Fue útil?

Solución

Es necesario para escapar de las barras en la expresión regular porque está utilizando barras como delimitador. También es posible usar otro 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);

Otros consejos

Cuando se utilizan los códigos de expresiones regulares proporcionados por los otros usuarios, asegúrese de agregar la "i" indicador para habilitar casos y la insensibilidad, por lo que va a trabajar tanto con http: // http: //. Por ejemplo, utilizando el código de caos:

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

En primer lugar, tiene que escapar, o incluso mejor, reemplazar los delimitadores-como se explica en las otras respuestas.

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

En segundo lugar, para mejorar aún más la expresión regular, la sintaxis de referencia reemplazo $n se prefiere sobre \\n, como se indica en el manual de .

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

En tercer lugar, se utiliza innecesariamente paréntesis de captura, que sólo retrasa las cosas. Deshazte de ellos. No se olvide de actualizar $1 a $0. En caso de que se preguntan, estos son paréntesis no captura: (?: )

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

Por último, me gustaría sustituir [^ ]+ con el \S más corto y más precisa, que es lo contrario de \s. Tenga en cuenta que [^ ]+ no permite espacios, pero acepta las nuevas líneas y las pestañas! \S no lo hace.

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

Su principal problema parece ser que usted está poniendo todo en paréntesis, por lo que no sabe qué "\ 1" es. Además, es necesario para escapar de la "/". Así que trate de esto:

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

Edit: En realidad, parece que los paréntesis no eran un problema, que leí mal. El escape seguía siendo un problema, ya que otros también señalaron. De cualquier solución debe trabajar.

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

Cuando se utiliza / como su delimitador de patrón, teniendo / dentro de su patrón no va a funcionar bien. He resuelto esto mediante el uso ! como delimitador de patrón, pero se pueden escapar barras con barras invertidas en su lugar.

Además, no me veo ninguna razón por la que estaba haciendo dos capturas paren, por lo quité uno de ellos.

Parte del problema en su situación es que se está ejecutando con las advertencias suprimidas; si hubiera error_reporting(E_ALL) en, habrías visto los mensajes de PHP está tratando de generar alrededor de su problema delimitador en su expresión regular.

Si hay múltiples URL contenida en una cadena separada por un salto de línea en lugar de un espacio, usted tiene que utilizar el \ S

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top