【问题标题】:php: split string into 3 parts by two delimiters where the first and the last "delimiters" are letters or numbers respectivelyphp:通过两个分隔符将字符串分成三部分,其中第一个和最后一个“分隔符”分别是字母或数字
【发布时间】:2017-01-28 14:34:12
【问题描述】:

任何想法如何将字符串分成三个部分,其中第一个和最后一个“定界符”分别是字母或数字?

$str = "%@-H-e-l-l-o-7-9#$%";

会这样拆分:

$arr=("%@-","H-e-l-l-o-7-9", "#$%");

$str = "Hi$73";

会这样拆分:

$arr=("","Hi$73", "");

$str = "Беларусь!";

会这样拆分:

$arr=("","Беларусь", "!");

$str = "!";

会这样拆分:

$arr=("!","", "");

$str = "";

会这样拆分:

$arr=("","", "");

$str = "ў55ЎW";

会这样拆分:

$arr=("","ў55ЎW", "");

这意味着它返回一个由 3 个元素组成的数组(总是),第二个元素的第一个和最后一个符号是数字或拉丁/西里尔字母,这个的第一个和最后一个(第三个)元素数组绝对不包含数字和字母,并且该字符串的连接是源字符串

谢谢。

【问题讨论】:

    标签: php arrays string preg-match preg-split


    【解决方案1】:

    使用preg_matcharray_slice函数的解决方案:

    $str = "%@-H-e-l-l-o-7-9#$%";
    
    preg_match('/^([^\w]*)(\w+.*\w+|\w)?([^\w]*)$/iu', $str, $matches);
    $parts = array_slice($matches, 1);
    
    print_r($parts);
    

    输出:

    Array
    (
        [0] => %@-
        [1] => H-e-l-l-o-7-9
        [2] => #$%
    )
    

    这种方法适用于您提供的所有输入案例

    【讨论】:

    • 似乎您的代码不适用于 1 个字母大小写。
    • @Haradzieniec,检查我的更新。现在应该可以正常工作了
    • 看起来有效!我发现的唯一问题 _ 下划线被视为字母,但那是因为 \w 是任何单词字符(字母、数字、下划线)。没有关于下划线的问题。这可能是一个单独的 SO 问题。非常感谢你的帮助!对此,我真的非常感激。谢谢!
    【解决方案2】:

    这是完成这项工作的一种方法:

    $in = array(
    "%@-H-e-l-l-o-7-9#$%",
    "Hi$73",
    "Беларусь!",
    "!",
    "",
    "ў55ЎW",
    '$abc$$$',
    "асоба_",
    "34.5",
    '#_!',
    );
    
    foreach($in as $elem) {
        preg_match('/^([^\pL\pN]*)((?=[\pL\pN]|$)[^_]*(?<=[\pL\pN])|^)?([^\pL\pN]*)$/u', $elem, $m);
        printf("'%15s'%s'%10s'\t%s'%10s'\t%s'%10s'%s", "$elem","=> (1): ",$m[1],"(2): ",$m[2], "(3): ",$m[3],"\n");
    
    }
    

    地点:

    • \pL 代表任何语言的任何字母
    • \pN 代表任何语言的任何数字

    输出:

    '%@-H-e-l-l-o-7-9#$%'=> (1): '       %@-'   (2): 'H-e-l-l-o-7-9'    (3): '       #$%'
    '          Hi$73'=> (1): '          '   (2): '     Hi$73'   (3): '          '
    'Беларусь!'=> (1): '          ' (2): 'Беларусь' (3): '         !'
    '              !'=> (1): '         !'   (2): '          '   (3): '          '
    '               '=> (1): '          '   (2): '          '   (3): '          '
    '        ў55ЎW'=> (1): '          ' (2): '   ў55ЎW' (3): '          '
    '        $abc$$$'=> (1): '         $'   (2): '       abc'   (3): '       $$$'
    '    асоба_'=> (1): '          '    (2): 'асоба'    (3): '         _'
    '           34.5'=> (1): '          '   (2): '      34.5'   (3): '          '
    '            #_!'=> (1): '       #_!'   (2): '          '   (3): '          '
    

    【讨论】:

    • 你有 Array([0] =&gt; Hi$73 [1] =&gt; [2] =&gt; Hi [3] =&gt; $73) 。但是OP想要$arr=("","Hi$73", "");
    • @RomanPerekhrest:没错,我已经编辑了代码,在字符类中插入$
    • 很抱歉接受不是您的最佳答案。两个答案都很完美,但感谢@RomanPerekhrest,他在您的答案中发现了一个小错误。这是我知道如何标记已接受答案的唯一原因。否则,两者都是完美的。非常感谢你们俩。
    • @Haradzieniec:别担心,我没问题。 Roman Perekhrest 已经在我之前回答了。
    • @Haradzieniec:查看我的新编辑,它现在适用于任何测试用例,34.5асоба_#_!,最后这两个不适用于 RomanPerekhrest 的正则表达式。
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多