我有一个这样的琴弦。
$str = "-=!#?Bob-Green_Smith";
$str = "-_@!?1241482";
我怎样才能在第一次字母数字匹配时爆炸它们。 例如:
$str = "-=!#?Bob-Green_Smith";
becomes:
$val[0] = "-=!#?";
$val[1] = "Bob-Green_Smith";
快速思考有时字符串不会包含初始字符串,
所以我需要检查第一个字符是否是字母数字。否则 Bob-Green_Smith 会在他不应该的时候被分割。
谢谢
您可以使用
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);
使用
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 => '',
)
你可以这样做:
$str = "-=!#?1Bob-Green_Smith";
preg_match('~[a-z0-9]~i', $str, $match, PREG_OFFSET_CAPTURE);
echo $bubString = substr($str, $match[0][1]);