James Harzs
James Harzs

Reputation: 1913

PHP Regex: match text urls until space or end of string

This is the text sample:

$text = "asd dasjfd fdsfsd http://11111.com/asdasd/?s=423%423%2F gfsdf http://22222.com/asdasd/?s=423%423%2F
asdfggasd http://3333333.com/asdasd/?s=423%423%2F";

This is my regex pattern:

preg_match_all( "#http:\/\/(.*?)[\s|\n]#is", $text, $m );

That match the first two urls, but how do I match the last one? I tried adding [\s|\n|$] but that will also only match the first two urls.

Upvotes: 3

Views: 4429

Answers (3)

jpiasetz
jpiasetz

Reputation: 1772

See What is the best regular expression to check if a string is a valid URL?

It has some very long regular expressions that will match all urls.

Upvotes: 0

Mario
Mario

Reputation: 36517

Don't try to match \n (there's no line break after all!) and instead use $ (which will match to the end of the string).

Edit: I'd love to hear why my initial idea doesn't work, so in case you know it, let me know. I'd guess because [] tries to match one character, while end of line isn't one? :)

This one will work:

preg_match_all('#http://(\S+)#is', $text, $m);

Note that you don't have to escape the / due to them not being the delimiting character, but you'd have to escape the \ as you're using double quotes (so the string is parsed). Instead I used single quotes for this.

Upvotes: 4

dsrekab
dsrekab

Reputation: 476

I'm not familar with PHP, so I don't have the exact syntax, but maybe this will give you something to try. the [] means a character class so |$ will literally look for a $. I think what you'll need is another look ahead so something like this:

#http:\/\/(.*)(?=(\s|$))

I apologize if this is way off, but maybe it will give you another angle to try.

Upvotes: 0

Related Questions