我找到了一个正则表达式样本,对我来说很有用。现在我需要修改它,但我在正则表达式上非常糟糕。我搜索谷歌并尝试了一些但我失败了。
这里是我发现的正则表达式:
$parsedMessage =
preg_replace(
array(
'/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/',
'/(^|[^a-z0-9_])@([a-z0-9_]+)/i', '/(^|[^a-z0-9_])#([a-z0-9şŞıİçÇöÖüÜĞğ_]+)/i'),
array(
'<a href="$1" target="_blank">$1</a>',
'$1<a href="/$2">@$2</a>',
'$1<a href="/hashtag/$2">#$2</a>'),
$message);
它返回$ message,替换为#hashtags,@ mentions和普通链接,现在我想添加这个(也找到它),
return preg_replace(
'/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i',
"<iframe src=\"//www.youtube.com/embed/$2\" type=\"text/html\" width=\"480\" height=\"270\" allowfullscreen></iframe>",
$string
);
就像你得到它一样,它将替换的youtube链接替换为嵌入代码。如果我这样使用它:
$parsedMessage =
preg_replace(
array('/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i',
'/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/',
'/(^|[^a-z0-9_])@([a-z0-9_]+)/i', '/(^|[^a-z0-9_])#([a-z0-9şŞıİçÇöÖüÜĞğ_]+)/i'),
array('<iframe src=\"//www.youtube.com/embed/$2\" type=\"text/html\" width=\"480\" height=\"270\" allowfullscreen></iframe>',
'<a href="$1" target="_blank">$1</a>',
'$1<a href="/$2">@$2</a>',
'$1<a href="/hashtag/$2">#$2</a>'),
$message);
返回
但这不是我想要的。这就是我需要的:
如果$ message包含youtube链接,请将链接替换为embed并继续替换tag.Else的常规链接,只需将普通链接替换为
感谢您的帮助。
答案 0 :(得分:0)
我解决了这个问题。如果您需要,您可以使用它:) Get it on github gist.
这里$ message是一个将被替换的文本。 (#hastags @mentions和http://youtube.com?v=blabla被替换)
User :: where('username',$ m [2]) - &gt; exists()是laravel的一部分,你可以评论这个条件
$ parsedMessage3被替换为文本。请注意,只允许使用一个YouTube链接。
function convert_clickable_links($message)
{
global $youtube_link;
global $count;
$parsedMessage1 = preg_replace_callback(
'/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))/',
function ($m) use($youtube_link,$count)
{
$matches=[];
$match_bool=preg_match
(
'/\s*[a-zA-Z\/\/:\.]*youtu(be.com\/watch\?v=|.be\/)([a-zA-Z0-9\-_]+)([a-zA-Z0-9\/\*\-\_\?\&\;\%\=\.]*)/i',
$m[0],
$matches
);
if($match_bool)
{
global $youtube_link;
global $count;
if($count>1)
{
return '<a href="'.$m[1].'" target="_blank">'.$m[1].'</a>';
}
else
{
$youtube_link='<iframe src="//www.youtube.com/embed/'.$matches[2].'" type="text/html" width="100%" height="270" allowfullscreen></iframe>';
}
++$count;
return '';
}
else
{
return '<a href="'.$m[1].'" target="_blank">'.$m[1].'</a>';
}
},
$message,-1,$count);
$parsedMessage1=$parsedMessage1.$youtube_link;
$parsedMessage2= preg_replace_callback(
'/(^|[^a-z0-9_])@([a-z0-9_]+)/i',
function ($m) {
if (User::where('username', $m[2])->exists())
{
return $m[1].'<a href="/'.$m[2].'">@'.$m[2].'</a>';
}
else
{
return ' @'.$m[2];
}
},
$parsedMessage1);
$parsedMessage3=preg_replace('/(^|[^a-z0-9_])#([a-z0-9şŞıİçÇöÖüÜĞğ_]+)/i','$1<a href="/hashtag/$2">#$2</a>',$parsedMessage2);
return $parsedMessage3;
}