PHP 在第一个字母数字字符处分解字符串

问题描述 投票:0回答:3

我有一个这样的琴弦。

$str = "-=!#?Bob-Green_Smith";

$str = "-_@!?1241482";

我怎样才能在第一次字母数字匹配时爆炸它们。 例如:

$str = "-=!#?Bob-Green_Smith";

becomes:

$val[0] = "-=!#?";
$val[1] = "Bob-Green_Smith";

快速思考有时字符串不会包含初始字符串,

所以我需要检查第一个字符是否是字母数字。否则 Bob-Green_Smith 会在他不应该的时候被分割。

谢谢

php explode
3个回答
1
投票

您可以使用

preg_match

这将匹配零个或多个“

non word characters
”作为第一组。
然后剩下的作为第二个。

输出将包含三个项目,第一个是完整字符串,因此我使用

array_shift
将其删除。

$str = "-=!#?Bob-Green_Smith";
Preg_match("/(\W*)(.*)/", $str, $val);
Array_shift($val); // remove first item
Var_dump($val);

https://3v4l.org/m2MCg


0
投票

使用

preg_split()
因为你确实想将字符串拆分成数组。匹配第一个出现的字母数字字符的位置,然后仅拆分一次。为了确保始终创建两个元素,请将后备数组与包含空字符串的 2 元素数组结合起来。

代码:(演示

var_export(
    preg_split('/(?=[[:alnum:]])/', $test, 2) + ['', '']
);

或者使用模式来匹配,然后“忘记”前导非字母数字字符。 (演示)

var_export(
    preg_split('/[^[:alnum:]]*\K/', $test, 2) + ['', '']
);

测试:

$tests = [
    "-=!#?Bob-Green_Smith",
    "-_@!?1241482",
    "8675309",
    "#!",
];

结果:

array (
  0 => '-=!#?',
  1 => 'Bob-Green_Smith',
)
array (
  0 => '-_@!?',
  1 => '1241482',
)
array (
  0 => '',
  1 => '8675309',
)
array (
  0 => '#!',
  1 => '',
)

-1
投票

你可以这样做:

$str = "-=!#?1Bob-Green_Smith";
preg_match('~[a-z0-9]~i', $str, $match, PREG_OFFSET_CAPTURE);
echo $bubString = substr($str, $match[0][1]);
© www.soinside.com 2019 - 2024. All rights reserved.