微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP如何在从字符串中提取数字块时避免使用混合字母数字

我正在编写一个PHP函数来从字符串中提取数字ID:

$test = '123_123_Foo'

起初我采用了两种不同的方法,一种方法是preg_match_all():

$test2 = '123_1256_Foo';
preg_match_all('/[0-9]{1,}/', $test2, $matches);
print_r($matches[0]); // Result: 'Array ( [0] => 123 [1] => 1256 )'

和其他preg_replace()和explode():

$test = preg_replace('/[^0-9_]/', '', $test);
$output = array_filter(explode('_', $test));
print_r($output); // Results: 'Array ( [0] => 123 [1] => 1256 )'

只要字符串不包含混合字母和数字,它们中的任何一个都可以正常工作:

$test2 = '123_123_234_Foo2'

明显的结果是Array([0] => 123 [1] => 1256 [2] => 2)

所以我写了另一个正则表达式来摆脱混合字符串:

$test2 = preg_replace('/([a-zA-Z]{1,}[0-9]{1,}[a-zA-Z]{1,})|([0-9]{1,}[a-zA-Z]{1,}[0-9]{1,})|([a-zA-Z]{1,}[0-9]{1,})|([0-9]{1,}[a-zA-Z]{1,})|[^0-9_]/', '', $test2);
$output = array_filter(explode('_', $test2));
print_r($output); // Results: 'Array ( [0] => 123 [1] => 1256 )'

问题也很明显,像Foo2foo12foo1这样更复杂的模式会通过过滤器.而这里我有点卡住了.

概括:

>从字符串中提取大量数字的变量.
>该字符串包含至少1个数字,可能包含其他数字
和由下划线分隔的字母.
>只能提取不在字母前面或后面的数字.
>只有字符串前半部分的数字很重要.

由于只需要上半部分,我决定在第一次出现字母或带有preg_split()的混合数字字母时拆分:

$test2 = '123_123_234_1Foo2'
$output = preg_split('/([0-9]{1,}[a-zA-Z]{1,})|[^0-9_]/', $test, 2);
preg_match_all('/[0-9]{1,}/', $output[0], $matches);
print_r($matches[0]); // Results: 'Array ( [0] => 123 [1] => 123 [2] => 234 )'

我的问题是,是否有更简单,更安全或更有效的方法来实现这一结果.

解决方法:

如果我正确理解您的问题,您希望拆分下划线分隔的字符串,并过滤掉任何非数字的子字符串.如果是这样,这可以在没有正则表达式的情况下实现,explode(),array_filter()ctype_digit();例如:

<?PHP

$str = '123_123_234_1Foo2';

$digits = array_filter(explode('_', $str), function ($substr) {
  return ctype_digit($substr);
});

print_r($digits);

这会产生:

Array
(
    [0] => 123
    [1] => 123
    [2] => 234
)

请注意ctype_digit():

Checks if all of the characters in the provided string are numerical.

所以$digits仍然是一个字符串数组,尽管是数字.

希望这可以帮助 :)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐