【问题标题】:PHP preg_match for getting a string out with variable lengthPHP preg_match 用于获取可变长度的字符串
【发布时间】:2023-01-12 20:07:03
【问题描述】:

我有以下字符串示例:034a412f500535454e5 在这里,我会取出 500。 搜索字符串总是前面有 8 位数字,后面有 8 位数字。 “500”可以有不同长度的数字(p.ex. 12345)。

有很多试验结束错误我发现

preg_match('/(.{8})(.*)(.{13})/', $a, $matches); 

有用。但我认为事实并非如此。

我不明白为什么左边是{8},右边是{13}。

我在下面得到我的字符串:

$lastInsertedId = 500;
$numArray = str_split(bin2hex(random_bytes(8)), 8);
$newArray = [$numArray[0],$lastInsertedId,$numArray[1]]; 
$a = vsprintf('%s%s%s',$newArray).RT; 

通过使用:

preg_match('/^.{8}\K.*(?=.{8}$)/', $a, $matches);

结果是 50053545。它不会返回正确的值。

通过使用:

preg_match('/^.{8}\K.*(?=.{8}$)/', '034a412f500535454e5', $matches);

它给了 500 回

怎么了?

gettype($a) 返回字符串。 我在 php 8.1.13

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    如果你想用正则表达式做到这一点,你可以使用

    ^.{8}K.*(?=.{8}$)
    

    请参阅regex demo。如果字符串包含换行符,请使用 s 标志。

    细节

    • ^ - 字符串的开头
    • .{8} - 八个字符
    • K - 省略到目前为止匹配的内容
    • .* - 任何零个或多个字符
    • (?=.{8}$) - 正向前瞻,要求任何八个字符后跟字符串位置的结尾立即出现在当前位置的右侧。

    另外,考虑使用substr

    $text = '034a412f500535454e5';
    echo substr($text, 8, strlen($text)-16); // => 500
    

    【讨论】:

    • 谢谢维克托。我编辑了我的问题。机智你的两个建议我有同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2015-08-17
    • 2011-03-02
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多