\$\开始组\$

我正在用PHP创建一个类,用于检测给定URL的社交网络或即时消息平台:

类SocialLinkParser{const TELEGRAM='telegram';const WHATSUP=“WHATSUP”;const YOUTUBE=“YOUTUBE”;const INSTAGRAMM=“instagram”;const LINKEDIN='LINKEDIN';const TWITTER='TWITTER';const FACEBOOK='FACEBOOK';const PINTEREST=“兴趣”;const REDDIT=“添加”;常量URL_MAPPINGS=['tg'=>自我::TELEGRAM,'t.me'=>自我::TELEGRAM,'wa.me'=>自我::WHATSUP,'youtu.be'=>自我::YOUTUBE,“instagr.am”=>自我::INSTAGRAMM,'lnkd.in'=>self::LINKEDIN,'t.co'=>自我::TWITTER,“x.com”=>自我::TWITTER,'fb.me'=>自我::FACEBOOK,'pin.it'=>自我::PINTEREST,'redd.it'=>自我::REDDIT];常量SCHEME_MAPPINGS=['tg'=>自我::TELEGRAM,];公共静态函数解析($link):字符串{$parsedLink=解析url($link);$scheme=strtolower($parsedLink['scheme']);//邀请链接不能以http开头if(!str_contains($scheme,'http')){return self::SCHEME_MAPPINGS[$SCHEME]$方案;}$path=strtower($parsedLink['path']);$domainParts=爆炸('.',$path);//拆下最后一部分。它是gtldarray_pop($domainParts);return self::URL_MAPPINGS[$path]??修剪(array_pop($domainParts));}}

其想法是根据url格式检测已知社交网站的社交网络名称。我检查了whatup、Telegram等邀请链接,以及每个网络生成的已知缩短URL。

不知何故,我希望有一种机制可以为每个社交网络生成特定的值,这样我可以在以后决定将列表链接呈现为html时要呈现什么图标。因此,为每个社交设置一个唯一的字符串有助于我获得一个带有可用社交图标的地图。该机制是单独实现的,以实现灵活性。


编辑1上下文

我想根据URL的社交网络显示这些图标(例如在配置中社交图标.php):

<?php(电话)返回[“facebook”=>“bi bi-facebook”,“推特”=>“双推特”,“instagram”=>“bi-in-stagram”,“youtube”=>“bi-bi-youtube”,'twitch'=>'bi bi-twitch',“电报”=>“双双电报”,'viber'=>'bi-bi-viber',“skype”=>“bi bi-skype”,'reddit'=>'bi-reddit',];

为此,我需要计算它的nessesary键。一个用法示例是:

$icons=require_once('icons.php');$url=htmlspecialchars(($_POST['url']?“”),ENT_QUOTES,'UTF-8')$icon=SocialLinkParser::解析($url)??“双联”echo“<i class='$icon'></i>$url</a>”;

我想把nessesary图标配置成一个单独的文件,所以我这样处理它。

可能的输入是:

  • IM邀请链接,例如skype(skype:skype_username?call)
  • 已知服务的Http链接:http://instagram.com
\$\端组\$
1
  • \$\开始组\$ 电报什么事拼写不正确。这可能不是问题,因为它们是相关的常量,但这只会伤害。。。 \$\端组\$ 评论 昨天

1答案1

重置为默认值
4
\$\开始组\$

测试套件

OP代码没有任何单元测试,它将从中受益。这将有助于温和的读者更好地理解哪些URL在范围内,哪些不是。

规范

该代码没有详细说明规格。在审查背景中,我们发现一个模糊的描述关于从“给定URL”“检测”平台。我必须相信作者已经想到了一些生成过程生成适合作为输入提供给parse()的URL。也就是说,调用方有义务确保URL在传递之前符合某些规范。

OP没有提供关于该规范是什么的太多指导。如果我们将此代码交给QA工程师并要求进行测试,现在还不清楚什么是合适的测试代码。

注释与代码

//邀请链接不能以http开头if(!str_contains($scheme,'http')){

注释描述了一个规则,代码实现了一个不同的规则。

请让代码检查前缀$scheme的。

因此,方案可能会丢失,这使我们生成
PHP警告:未定义的数组键“scheme”

公共API的设计

这又回到了有一个规范。parse函数没有详细说明它承诺返回给调用方的内容。它有四条返回路径,可以提供以下值

  • “电报”
  • “ftp”
  • ''
  • “什么事”
  • “交流”(用于'https://www.cardiff.ac.uk网址/')

不清楚调用方应该如何处理返回值源于空的查找结果,甚至不知道如何识别这样的结果。请写一个PhpDoc公司描述此功能的注释承诺要执行的操作。

偶然匹配

常量URL_MAPPINGS=['tg'=>自我::TELEGRAM,

那把钥匙很短.点,增加随机匹配无关URL的机会与Telegram无关。至少我们没有进行子字符串匹配,这是我最初的担忧,假设许多base64字符串都包含该bi-gram。

此外,这可能是来自SCHEME_MAPPINGS的copy-n-pasted吗,它根本不属于这里?

含糊的评论

//拆下最后一部分。它是gtldarray_pop($domainParts);

在最初的七个gTLD中,我愿意相信代码预期至少使用{.com网站,.net文件,.org网站}.该评论使得域名像{.co公司,.mobi(移动电话),.info(信息)}或更多现代添加物已考虑。

我担心的一部分是。.co.uk(英国)是用于分析的“顶层”,并且是否剥离.uk(英国)会给我们带来误导.co公司.规范将帮助我们回答这些问题。

尚不清楚为什么修剪()结果对调用方很重要,但这当然没有害处。

\$\端组\$

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.