如何忽略preg中的尾部斜杠替换

时间:2016-05-11 21:19:55

标签: php regex replace preg-replace vine

说我有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>~

但仍然没有运气。

如果有反斜杠,我该如何更换?

3 个答案:

答案 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>

演示:https://eval.in/569642