#!/usr/bin/perl -- use strict; use warnings; use Data::Dump qw/ dd /; use CGI qw/ escapeHTML /; my $text = "Video1: http://www.youtube.com/watch?v=dTi4v3HveqE Video2: [video]http://www.youtube.com/watch?v=dTi4v3HveqE[/video]"; $text =~ s{ (?: (^|\s|\>) # $1 ( # $2 (http|https) # $3 ://www.youtube.com/watch\?\S*v= ([a-z0-9-_%]+) # $4 [&\w;=\+\-]* ) ) | (?: \Q[video]\E ( # $5 (http|https) # $6 ://www.youtube.com/watch\?\S*v= ([a-z0-9-_%]+) # $7 [&\w;=\+\-]* ) \Q[/video]\E ) }{ my $ret = ""; my $https = $3 || $6; my $vid = $4 || $7; $ret .= "\n\n"; $ret .= escapeHTML($vid); $ret .= "\n\n"; $ret; }gmsxie; dd $text; print "\n\n$text\n"; __END__ "Video1:\n\ndTi4v3HveqE\n\n\nVideo2: \n\ndTi4v3HveqE\n\n" Video1: dTi4v3HveqE Video2: dTi4v3HveqE