Karem
Karem

Reputation: 18113

PHP: preg_match to str_replace?

At the moment I have this to check whether the $content is containing youtube link and if so then run the function youtubeFetchDataCallback():

if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $content, $matches)) {
  echo '<script type="text/javascript">';

  foreach(array_unique($matches) as $m) {
    echo "
      $.getJSON (
        'http://gdata.youtube.com/feeds/api/videos/$m?v=2&alt=json-in-script&callback=?',
        function(data) {
          youtubeFetchDataCallback(data, $id, '".$m."');
        } 
      );
    ";
  }

  echo '</script>';
}

This do work just fine although I wish to modify this so if there is a youtube link, remove it from the $content and run youtubeFetchDataCallback.

So by remove, maybe replace the youtubelink to '' (empty).

How can I do this? Thank you

UPDATE: Tried this so far:

if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $content, $matches)) {
  echo '<script type="text/javascript">';

  foreach(array_unique($matches) as $m) {
    echo "
      $.getJSON (
        'http://gdata.youtube.com/feeds/api/videos/$m?v=2&alt=json-in-script&callback=?',
        function(data) {
          youtubeFetchDataCallback(data, $id, '".$m."');
        } 
      );
    ";
  }

  echo '</script>';
}
$content = preg_replace("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", '', $content);
echo $content; 
?>

The videolink still is in the $content

Upvotes: 0

Views: 772

Answers (2)

Minkiele
Minkiele

Reputation: 1280

I would use preg_replace_callback to add the remote calls in one single Javascript block.

EDIT: It seems you want to remove all the link to youtube video, but if I understood the expression correctly the expression only matches some url params. Perhaps you could modify the regexp to match the whole url, and pass the youtube params as one or more capturing group to the callback.

Update (again) If you want to remove the link you may use a regexp like this:

'#<a(?:.+?)(?:(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+)(?:.+?)</a>#'

Update (again and again) This expression should cut out the whole URL because searches for anything that resembles the youtube domain, and then it goes straightforward until it finds a space (or a newline or a tab). You should also use the single quotes to surround this regexp.

'#(?:https?://)?(?:www\.)?youtube\.com/(?:[^\s]*)#'

Upvotes: 1

Felix Kling
Felix Kling

Reputation: 816930

Use preg_replace.

Upvotes: 1

Related Questions