views:

547

answers:

6

I've created this regex

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

that match every http://... or www.... but I dont know how to make preg_replace that would work, I've tried

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

but it doesn't work, the result is empty string.

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

When you use / as your pattern delimiter, having / inside your pattern will not work out well. I solved this by using ! as the pattern delimiter, but you could escape your slashes with backslashes instead.

I also didn't see any reason why you were doing two paren captures, so I removed one of them.

Part of the trouble in your situation is that you're running with warnings suppressed; if you had error_reporting(E_ALL) on, you'd have seen the messages PHP is trying to generate about your delimiter problem in your regex.

chaos
Funny that most used your incorrect regex for their examples.
Gumbo
I imagine we were all copying OP's. Fixed now, in any event.
chaos
+1  A: 

Your main problem seems to be that you are putting everything in parentheses, so it doesn't know what "\1" is. Also, you need to escape the "/". So try this:

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

Edit: It actually seems the parentheses were not an issue, I misread it. The escaping was still an issue as others also pointed out. Either solution should work.

Sasha
I'd just like to add that back references are numbered by the opening parenthesis. For example, in the regexp "T(e(st))", \1 contains "est", and \2 contains "st".
Bravery Onions
+3  A: 

You need to escape the slashes in the regex because you are using slashes as the delimiter. You could also use another symbol as the delimiter.

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

// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);
yjerem
Congrats! You’re the only one who doesn’t copy the incorrect regex from chaos.
Gumbo
+1  A: 

When using the regex codes provided by the other users, be sure to add the "i" flag to enable case-insensitivity, so it'll work with both HTTP:// and http://. For example, using chaos's code:

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

First of all, you need to escape—or even better, replace—the delimeters as explained in the other answers.

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

Secondly, to further improve the regex, the $n replacement reference syntax is preferred over \\n, as stated in the manual.

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

Thirdly, you are needlessly using capturing parentheses, which only slows things down. Get rid of them. Don't forget to update $1 to $0. In case you are wondering, these are non-capturing parentheses: (?: ).

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

Finally, I would replace [^ ]+ with the shorter and more accurate \S, which is the opposite of \s. Note that [^ ]+ does not allow spaces, but accepts newlines and tabs! \S does not.

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

All these regex not working for domain like internetwww.com

Shinta Widyaningsih