我正在为个人社交媒体链接(Instagram、Twitter和TikTok)添加个人表单

我正在努力寻找正确的模式来验证TikTok用户名.以下是我在Instagram上的预匹配代码.有没有人能给我提个建议,TikTok的模式是什么?表单必须接受整个URL和/或只接受句柄.也就是说,如果有人只提供了句柄@xyz或整个url www.tiktok.cpm/@xyz,则表单必须同时验证两者.

对于Instagram,我编写了以下正则表达式代码

    public function validate($value) {
    $value = $this->clean($value);

    // Validate as Instagram username (1-30 word characters, starts with @,
    return preg_match('/^@\w(?:(?:\w|(?:\.(?!\.))){0,28}(?:\w))?$/', $value);
}

仅供参考,函数CLEAN如下

 public function clean($value) {
        // Tolerate a link
        $url_matches = [];
        if (preg_match('/^https?:\/\/(?:www\.)?instagram\.com\/([\w.]+)\/?$/', $value, $url_matches)) {
            $value = '@' . $url_matches[1];
        }

        // Prepend with @ if not already present
        if (!preg_match('/^@/', $value)) {
            $value = '@' . $value;
        }

        return $value;
    } 

编辑过的

TikTok用户名有24个字符的限制.句柄前面会自动加一个"@"符号.用户名只能包含字母、数字、句点和下划线.

TikTok帐户示例-https://www.tiktok.com/@imperialcollegeunion/

Instagram帐户示例-https://www.instagram.com/icunion/

推荐答案

在这个TikTok page上,我发现了对用户名的以下要求:

用户名只能包含字母、数字、下划线和句点. 但是,句号不能放在用户名的末尾.

如果您声明用户名最多可以包含24个字符(我假设最小长度为1个字符),则可以匹配0-23个允许的字符,包括一个点,并排除用户名末尾的点.

请注意,如果您只提供句柄,并且相同的句柄对Instagram有效,则您必须确定优先级.

我不确定所有可用的TikTok URL,但如果你想使用锚匹配整个URL,以及http(S)和www.部件是可选的:

^(?:(?:https?://)?(?:www\.)?tiktok\.com/)?@([\w.]{0,23}\w)(?:/\S*)?$

Explanation

  • ^字符串开头
  • (?: Non capture group
    • (?:https?://)?匹配可选http://或https://
    • (?:www\.)?匹配可选www..
    • tiktok\.com/tiktok.com/
  • )?关闭非捕获组并将其设置为可选
  • @匹配字面意思
  • ([\w.]{0,23}\w)
  • (?:/\S*)?可选匹配/和可选的非空格字符
  • $字符串尾

Regex demo

如果在PHP中使用不同于/的分隔符,则不必转义正斜杠.

$pattern = "~^(?:(?:https?://)?(?:www\.)?tiktok\.com/)?@([\w.]{0,23}\w)(?:/\S*)?$~";

Php相关问答推荐

在WooCommerce中执行一次银行电汇确认付款代码

如何使用属性#[Embedded]嵌入带有规则的对象集合?

如何修复条带元素中的错误&&客户端_机密&

Laravel区分大小写搜索

Laravel路由到控制器传输变量解决方案需要

允许在WooCommerce管理订单列表中使用计费邮箱进行搜索

WooCommerce:如果订单总数为零,则隐藏本地取货运输选项

如何在 Woocommerce 中自动删除旧的已完成订单

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

使用 Spomky Labs JWT 框架中的 verifyWithKey 验证 id_token JWT 的签名需要 30 秒以上

PHP 解析 XML 以获取多个深度的所有字符串值

循环中未序列化数组显示的问题

如何在 php 中获取正确的时间

WooCommerce – 在新订单邮箱通知中显示产品分类计数

yii2 sql迁移覆盖新更改的记录

如何从此字符串创建 Carbon 对象:2022-06-21T05:52:46.648533678Z?

使用php删除数组中相同数字的所有变体

将 HTML 表单链接到 SQLite 数据库

Laravel Factory - 在单列中生成具有随机迭代量的假 json 数组数据

Eloquent 的模型更新了它应该 laravel php 的更多行