【发布时间】:2016-09-07 11:52:26
【问题描述】:
假设我在我的网站上发布了 2 个链接的变体...
(区别是尾随的/)
在我的网站上提交帖子后,它们会变成如下所示的超链接:
<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>
我已经设置了一个 preg 替换来捕获 vine 链接并将它们转换为嵌入(此帖子消息将包含更明显的内容,但这是例如缘故:
$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']);
我使用通配符(.*),我认为它的意思是“任何东西”,但由于某种原因,如果链接发布时带有斜杠,它不会被转换...
我尝试将我的 reg ex 更改为(我尝试过的只是几个示例)
~(<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 检查会做同样的事情,但什么也没做。
然后说嘿等等那不在 reg ex 所以我试了一下
~(<a href="https?://vine.co)/v/(.*/?)" target="_blank">(https?://vine.co)/v/(.*/?)<\/a>~
但还是没有运气。
如何让我的替换不在乎是否有尾随反斜杠?
【问题讨论】:
-
更好的用法是使用解析器。您可以对找到的第一个 URL 进行分组,然后检查
a中的值是否与反向引用\1或您进行的任何分组相同。解析器会更干净,更不容易出错。 stackoverflow.com/questions/3577641/… -
@user6188402 类似于
https://vine.co/v/iF20jKHvnqg/,例如,我猜 -
我只是问,因为我认为问题不是 link,而是与输入不匹配的正则表达式的另一部分
-
我也认为问题在于模式,无法匹配这样的链接......我花了一点时间才弄清楚是什么让我感到困惑
-
另外,我不确定在这种情况下是否需要正则表达式:结果字符串完全包含源字符串。剥离最终的斜杠并连接就足够了,或者只使用 sprintf。
标签: php regex replace preg-replace vine