Domanda

Ho creato questo regex

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

che corrispondono ogni http: // ... o www .... , ma non so come fare preg_replace che avrebbe funzionato, ho provato

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

ma non funziona, il risultato è stringa vuota.

È stato utile?

Soluzione

Hai bisogno di fuggire le barre nella regex perché si sta utilizzando barre come delimitatore. Si potrebbe anche usare un altro simbolo come delimitatore.

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

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

Altri suggerimenti

Quando si utilizzano i codici regex forniti dagli altri utenti, assicurarsi di aggiungere il flag "i" per consentire caso-insensibilità, in modo che funzionerà sia con http: // e http: //. Ad esempio, utilizzando il codice di caos:

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

Prima di tutto, è necessario fuggire, o meglio ancora, sostituire-i delimitatori come spiegato nelle altre risposte.

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

In secondo luogo, per migliorare ulteriormente la regex, la sintassi di riferimento sostituzione $n è preferito rispetto \\n, come indicato in manuale .

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

In terzo luogo, si sta inutilmente utilizza parentesi di cattura, che rallenta solo le cose. Sbarazzati di loro. Non dimenticare di aggiornare $1 a $0. Nel caso in cui vi state chiedendo, questi sono parentesi non-cattura: (?: )

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

Infine, vorrei sostituire [^ ]+ con il \S più breve e più accurata, che è l'opposto di \s. Si noti che [^ ]+ non consente spazi, ma accetta a capo e le schede! \S non lo fa.

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

Il problema principale sembra essere che si sta mettendo tutto in parentesi, in modo che non sa cosa "\ 1" è. Inoltre, è necessario sfuggire alla "/". Quindi, provate questo:

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

Edit: Sembra che in realtà le parentesi non erano un problema, ho letto male esso. La fuga era ancora un problema come altri ha anche sottolineato. Entrambe le soluzioni dovrebbe funzionare.

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

Quando si utilizza / come delimitatori, avendo / all'interno del vostro modello non funziona bene. Ho risolto questo utilizzando ! come delimitatore modello, ma si potrebbe sfuggire le vostre barre con backslash invece.

Ho anche non vedo alcuna ragione per cui si stava facendo due acquisizioni paren, così ho rimosso uno di loro.

Una parte del problema nella vostra situazione è che si sta eseguendo con avvisi soppresse; se tu avessi error_reporting(E_ALL) su, avresti visto il messaggio di PHP sta cercando di generare circa il tuo problema delimitatore nella vostra regex.

Se ci sono url multiple contenute in una stringa un separate da una linea di rottura invece di uno spazio, è necessario utilizzare il \ S

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top