Helena
Helena

Reputation: 115

Regular Expression (preg_match)

This is the not working code:

<?php
$matchWith = "  http://videosite.com/ID123 ";
preg_match_all('/\S\/videosite\.com\/(\w+)\S/i', $matchWith, $matches);  
foreach($matches[1] as $value)
{  
    print '<a href="http://videosite.com/'.$value.'">Hyperlink</a>';        
}  
?>

What I want is that it should not display the link if it has a whitespace before or after. So now it should display nothing. But it still displays the link.

Upvotes: 3

Views: 307

Answers (4)

bozdoz
bozdoz

Reputation: 12890

It would probably be simpler to use this regex:

'/^http:\/\/videosite\.com\/(\w+)$/i'

I believe you are referring to the white space before http, and the white space after the directory. So, you should use the ^ character to indicate that the string must start with http, and use the $ character at the end to indicate that the string must end with a word character.

Upvotes: 0

FailedDev
FailedDev

Reputation: 26940

You can try this. It works:

if (preg_match('%^\S*?/videosite\.com/(\w+)(?!\S+)$%i', $subject, $regs)) {
    #$result = $regs[0];
}

But i am positive that after I post this, you will update your question :)

Explanation:

"
^            # Assert position at the beginning of the string
\S           # Match a single character that is a “non-whitespace character”
   *?           # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
\/           # Match the character “/” literally
videosite    # Match the characters “videosite” literally
\.           # Match the character “.” literally
com          # Match the characters “com” literally
\/           # Match the character “/” literally
(            # Match the regular expression below and capture its match into backreference number 1
   \w           # Match a single character that is a “word character” (letters, digits, etc.)
      +            # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
(?!          # Assert that it is impossible to match the regex below starting at this position (negative lookahead)
   \S           # Match a single character that is a “non-whitespace character”
      +            # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
\$            # Assert position at the end of the string (or before the line break at the end of the string, if any)
"

Upvotes: 2

Arend
Arend

Reputation: 3772

This can also match ID12, because 3 is not an space, and the / of http:/ is not a space. You can try:

preg_match_all('/^\S*\/videosite\.com\/(\w+)\S*$/i', $matchWith, $matches);

Upvotes: 2

William Stearns
William Stearns

Reputation: 479

So, you don't want it to display if there's whitespaces. Something like this should work, didn't test.

preg_match_all('/^\S+?videosite\.com\/(\w+)\S+?$/i', $matchWith, $matches);

Upvotes: 2

Related Questions