Question

Je l'ai créé ce regex

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

qui correspondent tous les http: // ... ou www .... mais je ne sais pas comment faire preg_replace qui fonctionnerait, je l'ai essayé

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

mais il ne fonctionne pas, le résultat est une chaîne vide.

Était-ce utile?

La solution

Vous devez échapper aux barres obliques dans le regex parce que vous utilisez des barres obliques comme séparateur. Vous pouvez également utiliser un autre symbole comme séparateur.

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

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

Autres conseils

Lorsque vous utilisez les codes regex fournis par les autres utilisateurs, assurez-vous d'ajouter le « i » drapeau pour permettre insensibilité à la casse, donc il va travailler avec HTTP: // et http: //. Par exemple, en utilisant le code de chaos:

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

Tout d'abord, vous avez besoin d'échapper ou encore mieux, remplacer les-délimiteurs comme expliqué dans les autres réponses.

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

En second lieu, pour améliorer encore l'expression rationnelle, la syntaxe de référence de remplacement $n est préférable à \\n, comme indiqué dans la section manuel.

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

Troisièmement, vous utilisez inutilement des parenthèses de capture, ce qui ne fait que ralentir les choses. Se débarrasser d'eux. Ne pas oublier de mettre à jour $1 à $0. Si vous vous demandez, ce sont entre parenthèses non-capture: (?: )

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

Enfin, je remplacerais [^ ]+ avec le \S plus court et plus précis, ce qui est à l'opposé de \s. Notez que [^ ]+ ne permet pas d'espaces, mais accepte les nouvelles lignes et onglets! \S ne fonctionne pas.

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

Votre principal problème semble être que vous mettez tout entre parenthèses, il ne sait pas ce que « \ 1 » est. Aussi, vous devez d'échapper à la « / ». Donc, essayez ceci:

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

Edit: Il semble en fait les parenthèses ne sont pas un problème, je mal lu. L'Évasion était encore un problème que d'autres ont également souligné. De toute solution devrait fonctionner.

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

Lorsque vous utilisez / comme délimiteur de motif, ayant / l'intérieur de votre modèle ne fonctionne pas bien. Je résolu ce problème en utilisant ! comme séparateur de modèle, mais vous pouvez échapper à vos barres obliques avec des barres obliques inverses au lieu.

Je vois aussi ne pas aucune raison pour laquelle vous faisiez deux captures PAREN, alors j'ai enlevé l'un d'eux.

Une partie de la peine dans votre situation est que vous utilisez avec des avertissements supprimés; si vous aviez error_reporting(E_ALL), vous auriez vu les messages PHP tente de générer votre problème delimiter dans votre regex.

S'il y a des URL multiples contenus dans une chaîne a séparés par un saut de ligne au lieu d'un espace, vous devez utiliser le \ S

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top