V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  PHP

没写过 PHP ,临时需要,有 V 友能帮忙把这 20 行 JavaScript 移植到 PHP 吗?

  •  
  •   edis0n0 · 112 天前 · 4403 次点击
    这是一个创建于 112 天前的主题,其中的信息可能已经有所发展或是发生改变。
    function convert(input = "") {
        let pdst = input.toUpperCase().trim();
        let pit = [];
        let isg = "";
        while (/[0-9A-Z]+/.exec(pdst) !== null) {
            let data = /[0-9A-Z]+/.exec(pdst);
            if (data !== null) {
                let pd = data[0];
                let pdt = pd.length;
                if (/[0-9]+/.test(pd) && pd.length < 8) isg += pd;
                if (isg.length == 15) pd = isg;
                if (isg.length >= 15) isg = "";
                if (/[0-9]+/.test(pd) && pd.length == 11 && pd.substring(0, 1).toLowerCase() == "s") pit.push(pd.trim().substring(1, 11));
                if (/[0-9]+/.test(pd) && pd.length == 13 && pd.substring(0, 1).toLowerCase() == "s") pit.push(pd.trim().substring(1, 13));
                if ((/[0-9]+/.test(pd) && pd.length == 15) || pd.length == 12 || pd.length == 10 || (/[0-9]+/.test(pd) && pd.length == 8)) pit.push(pd);
                pdst = pdst.substring(pdt).trim();
            }
        }
        return Array.from(new Set(pit));
    }
    
    32 条回复    2022-10-12 17:16:29 +08:00
    phpfpm
        1
    phpfpm  
       112 天前 via Android
    直接 node 跑
    edis0n0
        2
    edis0n0  
    OP
       112 天前
    @phpfpm #1 有并发要求
    flyqie
        3
    flyqie  
       112 天前 via Android
    给个示例输入?
    snoopyhai
        4
    snoopyhai  
       112 天前
    语法没有差太多,边查手册边翻译吧
    ywmail
        5
    ywmail  
       112 天前   ❤️ 2
    github copilot 转换的:
    ```
    function convert($input = "") {
    $pdst = strtoupper(trim($input));
    $pit = [];
    $isg = "";
    while (preg_match_all("/[0-9A-Z]+/", $pdst) !== null) {
    $data = preg_match_all("/[0-9A-Z]+/", $pdst);
    if ($data !== null) {
    $pd = $data[0];
    $pdt = strlen($pd);
    if (preg_match_all("/[0-9]+/", $pd) && strlen($pd) < 8) $isg .= $pd;
    if (strlen($isg) == 15) $pd = $isg;
    if (strlen($isg) >= 15) $isg = "";
    if (preg_match_all("/[0-9]+/", $pd) && strlen($pd) == 11 && strtolower(substr($pd, 0, 1)) == "s") array_push($pit, substr($pd, 1, 10));
    if (preg_match_all("/[0-9]+/", $pd) && strlen($pd) == 13 && strtolower(substr($pd, 0, 1)) == "s") array_push($pit, substr($pd, 1, 12));
    if ((preg_match_all("/[0-9]+/", $pd) && strlen($pd) == 15) || strlen($pd) == 12 || strlen($pd) == 10 || (preg_match_all("/[0-9]+/", $pd) && strlen($pd) == 8)) array_push($pit, $pd);
    $pdst = substr($pdst, $pdt);
    }
    }
    return array_unique($pit);
    }
    ```
    musi
        6
    musi  
       112 天前
    不懂就问,这段代码的 node 并发干不过 php ?
    Marinaaaa
        7
    Marinaaaa  
       112 天前
    @ywmail 学到了,原来 github copilot 还能这样玩, 牛哇!
    kamal
        8
    kamal  
       112 天前
    @ywmail #5 好奇这是用什么命令做到的?
    iddddg
        9
    iddddg  
       112 天前
    @ywmail 同样好奇怎么转的,难道把 js 放在注释里?
    helone
        11
    helone  
       112 天前
    @musi PHP 大部分情况下效率其实还不错,因为底层基本都是 C 写的
    musi
        12
    musi  
       112 天前
    @helone #11 node 底层也是 c++,感觉从这里比较不出来什么吧
    landers2015
        13
    landers2015  
       112 天前
    @ywmail 你交了$了?还是有科学方式?求分享
    zoharSoul
        14
    zoharSoul  
       112 天前
    @learningman #10
    怎么转的?
    ljt990218
        15
    ljt990218  
       112 天前
    @landers2015 可以上万能的 tb 不到 99rmb/年
    ljt990218
        16
    ljt990218  
       112 天前
    @landers2015 GitHub 有学生包 里面有 github copilot 还有其他的
    liuxu
        17
    liuxu  
       112 天前
    两个半斤八两吧,是不是 js 的正则引擎跟不上,预编译缓存一下
    helone
        18
    helone  
       112 天前
    @musi node 中间还有一个 v8 引擎,php 的大部分代码其实是以 c 的形式在跑的,典型的场景就是图片验证码的生成,php 写出来的生成速度比 Go 还要快几倍
    lysS
        19
    lysS  
       112 天前
    @helone #18 这种得是官方的函数或者用插件吧、其实就是调存在的 abi 接口,自己写的代码逻辑是做不到的
    xxiu
        20
    xxiu  
       112 天前
    https://models.aminer.cn/codegeex/zh-CN/codeTranslator

    function convert($input) {
    $pdst = strtoupper($input);
    $pit = array();
    $isg = "";
    while (preg_match("/[0-9A-Z]+/", $pdst, $matches)) {
    $data = $matches;
    if ($data) {
    $pdt = strlen($data[0]);
    if (strpos($data[0], "1") === 0 && strpos($data[0], "2") === strlen($data[0]) - 1) $isg = $data[0];
    if (strpos($data[0], "1")!== 0 && strpos($data[0], "2")!== strlen($data[0]) - 1) $isg = "";
    if (strpos($data[0], "1") === 0 && strpos($data[0], "2")!== strlen($data[0]) - 1) $isg = "";
    if ($isg!== "") $pdst = substr($pdst, 0, strpos($pdst, $isg) - 1). $isg.substr($pdst, strlen($isg));
    if (strpos($data[0], "1")!== 0 && strpos($data[0], "2") === strlen($data[0]) - 1) $pit[] = substr($pdst, 0, strpos($pdst, $data[0]) - 1).substr($pdst, strlen($data[0]));
    if (strpos($data[0], "1") === 0 && strpos($data[0], "2")!== strlen($data[0]) - 1) $pit[] = substr($pdst, 0, strpos($pdst, $data[0]) - 1);
    if (strpos($data[0], "1")!== 0 && strpos($data[0], "2")!== strlen($data[0]) - 1) $pit[] = substr($pdst, 0, strpos($pdst, $data[0]) - 1).substr($pdst, strlen($data[0])).substr($pdst, strpos($pdst, $data[0]) + strlen($data[0]) - strlen($pdst));
    if (strpos($data[0], "1")!== 0 && strpos($data[0], "2") === strlen($data[0]) - 1) $pit[] = substr($pdst, 0, strpos($pdst, $data[0]) - 1).substr($pdst, strlen($data[0])).substr($pdst, strpos($pdst, $data[0]) + strlen($data[0]) - strlen($pdst));
    $pdst = substr($pdst, $pdt);
    }
    }
    return $pit;
    }
    ForkGagHub
        21
    ForkGagHub  
       112 天前
    虽然我不会拍黄片,但是帮你找到了一个网站
    https://wtools.io/javascript-to-php-converter

    <?php
    $var = 'function convert(input = "") {
    let pdst = input.toUpperCase().trim();
    let pit = [];
    let isg = "";
    while (/[0-9A-Z]+/.exec(pdst) !== null) {
    let data = /[0-9A-Z]+/.exec(pdst);
    if (data !== null) {
    let pd = data[0];
    let pdt = pd.length;
    if (/[0-9]+/.test(pd) && pd.length < 8) isg += pd;
    if (isg.length == 15) pd = isg;
    if (isg.length >= 15) isg = "";
    if (/[0-9]+/.test(pd) && pd.length == 11 && pd.substring(0, 1).toLowerCase() == "s") pit.push(pd.trim().substring(1, 11));
    if (/[0-9]+/.test(pd) && pd.length == 13 && pd.substring(0, 1).toLowerCase() == "s") pit.push(pd.trim().substring(1, 13));
    if ((/[0-9]+/.test(pd) && pd.length == 15) || pd.length == 12 || pd.length == 10 || (/[0-9]+/.test(pd) && pd.length == 8)) pit.push(pd);
    pdst = pdst.substring(pdt).trim();
    }
    }
    return Array.from(new Set(pit));
    }
    l9rw
        22
    l9rw  
       112 天前
    楼上工具转出来的代码第五行的判断都是错的
    edis0n0
        23
    edis0n0  
    OP
       112 天前
    @l9rw #22 对,楼上转出来的没有一个能工作,在翻文档找问题
    Austaras
        24
    Austaras  
       112 天前
    你真要并发的话不如在 node 里面开个 worker ,反正都是原生数据类型
    Light3
        25
    Light3  
       112 天前
    会写 php 但是 js 会的不多
    没看懂楼主接了个字符串 为什么要循环字符串..

    给楼主指一下 如何快速写出来
    字符串 用 str_split() 分成数组
    然后 foreach($list as $k=>$v){

    } 循环

    在循环里面 $k+1 就是字符串的第几位 然后判断
    php 字符串 拼接值 +. 就可以
    数组 直接[] 赋值就可以

    php 正则函数 preg_match() 如果纯判断数字 is_numeric() 也可以


    自己试试吧
    zjsxwc
        26
    zjsxwc  
       112 天前
    直接用这个 php 写的 js 解释器,在 php 里面运行 js
    https://github.com/hiltonjanfield/js4php5
    wuxiaoqing234
        27
    wuxiaoqing234  
       112 天前
    @zjsxwc 你搞这个还得看入参和出参, 还不如直接看语法..
    ywmail
        28
    ywmail  
       111 天前
    @Marinaaaa @iddddg @kamal
    copilot 还有另一个 vs code 插件:github copilot labs ,用它转的。

    @landers2015
    折腾了一圈替代品,发现和 copilot 差距太大,最后交了$买的。
    Chaningnt
        29
    Chaningnt  
       111 天前   ❤️ 1
    测试了两三条数据
    function convert($input){
    $pdst = trim(strtoupper($input));
    $isg = '';
    $pit = [];
    while (preg_match('/[0-9A-Z]+/', $pdst, $data) != false){
    if(count($data) > 0){
    $pd = $data[0];
    $pdt = strlen($pd);
    if(preg_match('/[0-9]+/', $pd) && strlen($pd) < 8 ){
    $isg .= $pd;
    }
    if(strlen($isg) == 15){
    $pd = $isg;
    }
    if(strlen($isg) >= 15){
    $isg = '';
    }
    if(preg_match('/[0-9]+/', $pd) && strlen($pd) == 11 && substr($pd, 0, 1) == 's'){
    $pit[] = substr(trim($pd), 1, 11);
    }
    if(preg_match('/[0-9]+/', $pd) && strlen($pd) == 13 && substr($pd, 0, 1) == 's'){
    $pit[] = substr(trim($pd), 1, 13);
    }
    if((preg_match('/[0-9]+/', $pd) && strlen($pd) == 15) || strlen($pd) == 12 || strlen($pd) == 10 || (preg_match('/[0-9]+/', $pd) && strlen($pd) == 8)){
    $pit[] = $pd;
    }
    $pdst = trim(substr($pdst, $pdt));
    }
    }
    return $pit;
    }
    Chaningnt
        30
    Chaningnt  
       111 天前   ❤️ 1
    @Chaningnt 返回结果应该是要去重,改成 return array_unique($pit);
    Chaningnt
        31
    Chaningnt  
       111 天前   ❤️ 1
    按 js 的格式处理了一下

    function convert($input){
    $pdst = trim(strtoupper($input));
    $isg = '';
    $pit = [];
    while (preg_match('/[0-9A-Z]+/', $pdst, $data) != false){
    if(count($data) > 0){
    $pd = $data[0];
    $pdt = strlen($pd);
    if(preg_match('/[0-9]+/', $pd) && strlen($pd) < 8 ) $isg .= $pd;
    if(strlen($isg) == 15) $pd = $isg;
    if(strlen($isg) >= 15) $isg = '';
    if(preg_match('/[0-9]+/', $pd) && strlen($pd) == 11 && substr($pd, 0, 1) == 's') $pit[] = substr(trim($pd), 1, 11);
    if(preg_match('/[0-9]+/', $pd) && strlen($pd) == 13 && substr($pd, 0, 1) == 's') $pit[] = substr(trim($pd), 1, 13);
    if((preg_match('/[0-9]+/', $pd) && strlen($pd) == 15) || strlen($pd) == 12 || strlen($pd) == 10 || (preg_match('/[0-9]+/', $pd) && strlen($pd) == 8)) $pit[] = $pd;
    $pdst = trim(substr($pdst, $pdt));
    }
    }
    return array_unique($pit);
    }
    edis0n0
        32
    edis0n0  
    OP
       111 天前
    @Chaningnt #31 谢谢!晚上测试一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1622 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 14:45 · PVG 22:45 · LAX 06:45 · JFK 09:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.