说我有2个链接的变体会在我的网站上发布...
(差异在于尾随/)
在我的网站上提交帖子后,他们会变成如下所示的超链接:
<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>
我已经设置了一个preg替换来捕获藤蔓链接并将它们转换为嵌入(这个帖子消息会更明显地包含但是这是例如:
$this->post['message'] = '<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>';
$drc_embed_vine = '<iframe src="https://vine.co/v/\2/embed/simple" width="480" height="480" frameborder="0"></iframe>';
$this->post['message'] = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $this->post['message']);
我使用了通配符(.*)
,我认为这意味着'任意',但出于某种原因,如果链接以尾随斜杠发布,则不会被转换...
我已经尝试将我的注册表改为(只是我试过的一些例子)
~(<a href="https?://vine.co)/v/(.*)/" target="_blank">(https?://vine.co)/v/(.*)/<\/a>~
然后使用尾部反斜杠转换链接并忽略没有的链接。
~(<a href="https?://vine.co)/v/(.*)/?" target="_blank">(https?://vine.co)/v/(.*)/?<\/a>~
我有点想到嘿也许是?我用于https检查会做同样的事情,但什么也没做。
然后说嘿等待那不在注册表中,所以我试着像
~(<a href="https?://vine.co)/v/(.*/?)" target="_blank">(https?://vine.co)/v/(.*/?)<\/a>~
但仍然没有运气。
如果有反斜杠,我该如何更换?
答案 0 :(得分:1)
如果您只需要这个非常具体的替换,您可以只连接字符串。
$message = rtrim($post['message'], '/');
$message = sprintf('<iframe src="%s/embed/simple" width="480" height="480" frameborder="0"></iframe>', $message);
或者如果你真的想使用preg_replace:
$pattern = '~https?://vine.co/v/([^/]+)~';
$this->post['message'] = preg_replace($pattern, $drc_embed_vine, $this->post['message']);
您的模式需要匹配输入字符串($this->post['message']
)。然后,将匹配结果($1
)放在最终字符串中。
如果不关心斜杠,只考虑视频ID永远不会包含斜杠:显然,它是字母数字[a-zA-Z0-9]
。我们使用([^/]+)
除了尾部斜杠之外的所有字符。您可以将([a-z0-9])
与i
修饰符一起使用。
您在最终字符串上构建了一个模式,并尝试将其与输入字符串匹配。
这个脚本:
<?php
$message = 'https://vine.co/v/iF20jKHvnqg/';
$drc_embed_vine = '<iframe src="https://vine.co/v/\1/embed/simple" width="480" height="480" frameborder="0"></iframe>';
$pattern = '~https?://vine.co/v/([^/]+)/?~';
echo preg_replace($pattern, $drc_embed_vine, $message);
产生这个:
<iframe src="https://vine.co/v/iF20jKHvnqg/embed/simple" width="480" height="480" frameborder="0"></iframe>
修改强>
根据您的评论,这是一个新模式,以匹配提交的网址上的链接:
$pattern = '~^(<[^>]+>)https?://vine.co/v/([^/]+)/?(</a>)$~';
此模式可以匹配<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>
。
替换字符串略有变化:
'<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'
所以我有这个测试脚本,它会替换iframe提到的链接:
<?php
$message = '<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>';
$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>';
$pattern = '~^(<[^>]+>)https?://vine.co/v/([^/]+)/?(</a>)$~';
echo preg_replace($pattern, $drc_embed_vine, $message);
答案 1 :(得分:1)
在我提出的另一个问题中回答,它并没有忽略尾部斜杠,而只是将它们全部一起删除。
$this->post['message'] = preg_replace('+/(["<])+', '$1', $this->post['message']);
rtrim无法工作,因为/不是字符串的最后一个。
答案 2 :(得分:0)
这是一个解析器示例:
$string = '<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>';
$doc = new DOMDocument();
$doc->loadHTML($string);
$links = $doc->getElementsByTagName('a');
foreach($links as $link) {
if(preg_match('~^https?://vine\.co/v/([^/]+)~', $link->getAttribute('href'), $url)){
echo '<iframe src="https://vine.co/v/' . $url[1] . '/embed/simple" width="480" height="480" frameborder="0"></iframe>';
}
}
输出:
<iframe src="https://vine.co/v/iF20jKHvnqg/embed/simple" width="480" height="480" frameborder="0"></iframe>