当前位置: 首页 > 知识库问答 >
问题:

正则表达式用链接替换url并添加特定的rel

姬振濂
2023-03-14

下面的代码是从字符串中检查任何URL的文本,并将其转换为可单击的链接。

我正在尝试获取它,以便如果有一个指向图像的链接,它会在

如果字符串中只有一个链接,它就可以正常工作。当有多个链接时,所有链接都得到最后一个链接的rel。

$text = "http://site.com a site www.anothersite.com/ http://imgur.com/image.png http://youtu.be/UyxqmghxS6M here is another site";

$linkstring = preg_replace('/(http|ftp)?+(s)?:?(\/\/)?+(www.)?((\w|\.)+)+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU|be|info|co)+(\/)?(\S+)?/i', '<a rel="iframe" href="\0">\0</a>', $text ); 
if(preg_match('/((http:\/\/)?(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/v\/)([\w-]{11}).*|http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*)/i', $linkstring, $vresult)) {
    $pattern = "/(http|ftp)?+(s)?:?(\/\/)?+(www.)?((\w|\.)+)+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU|be|info|co)+(\/)?(\S+)?/i";
    $replacement = '<a rel="youtube" href="\0">\0</a>';
    $text2 = preg_replace($pattern, $replacement, $text);
    $type= 'youtube';
} elseif(preg_match('/(http(s?):)?|([\/|.|\w|\s])*\.(?:jpg|gif|png|jpeg|bmp)/i', $linkstring, $vresult)) {
    $pattern = "/(http|ftp)?+(s)?:?(\/\/)?+(www.)?((\w|\.)+)+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU|be|info|co)+(\/)?(\S+)?/i";
    $replacement = '<a rel="image" href="\0">\0</a>';
    $text2 = preg_replace($pattern, $replacement, $text);
    $type= 'image';
} else {
    $type = 'none';
}
echo $text, "<br />";
echo $text2, "<br />";
echo $linkstring, "<br />";
echo $type, "<br />";

我曾尝试更改$pattern,使其与youtube或图像链接匹配相同的正则表达式,但最终在URL后为整个文本创建了一个链接。

例子:

$text = "http://site.com a site www.anothersite.com/ http://imgur.com/image.png http://youtu.be/UyxqmghxS6M here is another site";

$linkstring = preg_replace('/(http|ftp)?+(s)?:?(\/\/)?+(www.)?((\w|\.)+)+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU|be|info|co)+(\/)?(\S+)?/i', '<a rel="iframe" href="\0">\0</a>', $text ); 
if(preg_match('/((http:\/\/)?(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/v\/)([\w-]{11}).*|http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*)/i', $linkstring, $vresult)) {
    $pattern = "/((http:\/\/)?(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/v\/)([\w-]{11}).*|http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*)/i";
    $replacement = '<a rel="youtube" href="\0">\0</a>';
    $text2 = preg_replace($pattern, $replacement, $text);
    $type= 'youtube';
} else {
    $type = 'none';
}

共有1个答案

颜英博
2023-03-14

不幸的是,我无法让您的正则表达式正常工作,无法准确查看您的输出(如果您发布结果字符串而不是仅仅描述它们,可能会有所帮助)。

然而,你做的是以下这些。在if语句的第一个片段中,检查字符串是否包含youtube链接或图像链接。但是你根本不使用这些信息,只是在整个初始字符串上再次使用preg_replace。这当然取代了所有的链接,而不仅仅是你发现的preg_match之前(因为调用是完全不相关的)。

所以你的第二种方法实际上更好。不过,我认为在这种情况下根本不需要if子句,因为只有匹配相同模式的字符串部分才会被替换。在链接之后获得完整字符串的原因是RegExes中的贪婪。它的发生是因为你用结束了两个可能的youtube模式。*。这可能会导致只匹配URL的剩余部分,但它总是尽可能多地。因为.匹配任何字符,这就是字符串的其余部分。所以首先,您需要告诉正则表达式在哪里停止考虑字符。例如,您可以说URL以空格或引号结束。所以与其

(youtubepattern1).*|(youtubepattern2).*

你可以试试

((youtubepattern1|youtubepattern2).*)["\s]

但是现在贪婪仍然是一个问题,如果URL后面有多个引号,或者字符串后面有更多的空格(因为在最后一个空格或引号之前,它将包含所有内容)。(在PHP的正则表达式方法中)告诉解释器处理。*笨拙地添加一个问号:

((youtubepattern1|youtubepattern2).*?)["\s]

此外,您可能需要将替换内容从使用\0改为现在使用\1(因为\0将包含URL结尾的空格或引号)。

 类似资料:
  • 问题内容: 如何将某些文本转换为链接?回到PHP中,我使用了这段代码,该代码非常适合我的目的: 我尝试使用Python,但是无法使其正常工作。如果有人可以将其转换为Python :)。 问题答案: 下面的代码是对python的简单翻译。您应该确认它确实可以满足您的要求。有关更多信息,请参见Python正则表达式HOWTO。 这是我最后的输出:

  • 本文向大家介绍正则表达式链接替换函数的技巧,包括了正则表达式链接替换函数的技巧的使用技巧和注意事项,需要的朋友参考一下 正则表达式链接替换函数的技巧如下所示: 1) 字符串       前面的字符<a href="http://www.aaa.cn/000011.html">任意长度字符</a>后面的字符 替换成        前面的字符<a href="http://www.bbb.cn/fol

  • 问题内容: 我需要替换字符串的一部分。我浏览了Python文档并发现了re.sub。 我期望这能打印,而不是“酒吧”。 谁能告诉我我做错了什么? 问题答案: 除了捕获要 替换 的零件外,您还可以捕获要 保留 的零件,然后使用引用对其进行引用以将它们包括在替换字符串中。 尝试以下方法: 另外,假设这是HTML,则应考虑使用HTML解析器来执行此任务,例如Beautiful Soup 。

  • 通过好奇心,有没有办法用Java Stream编写它?

  • Change is inevitable, except from vending machines. — Robert C. Gallagher Puppet 的 regsubst 函数提供了一种处理文本的简单方法, 用于在字符串中查找和替换,或者从字符串提取匹配的模式。 例如,我们通常需要对从 facter 或者从外部程序获得的数据做这样的处理。 在本例中将会看到如何使用 regsubst 提

  • 问题内容: 我有这个字符串: 现在,我想在每个数字之前添加String num:。 因此结果必须是: 这也必须工作: 用于搜索数字的正则表达式是:[0-9]+ 但是我想用num:+ [匹配的子字符串]替换匹配的子字符串。 我现在写了一个带有数字的示例,但另一个示例可以是:在每个电子邮件地址之前添加 ·Email found·: 问题答案: 利用分组。您可以使用括号(并)定义组,并通过组索引$n在哪