preg_split in php 在数字前面和后面是字母或空格的点处拆分字符串 space
preg_split in php to split string at the point which is preceded by digit and is followed by letters or blank space
为了在前面是数字后面是字母的点处拆分我的字符串,如:
$str = '12jan';
我用过
$arr = preg_split('/(?<=[0-9])(?=[a-z]+)/i',$str);
它可以运行文件并提供所需的输出。我想更新它,以便它为类似字符串提供相同的输出。
$str='12 jan';
$str='12 jan';
$str='12/jan';
$str='12//jan';
$str='12/jan';
$str='12*/jan';
$str='12*//jan';
代码应该适用于上面给出的任何字符串,所以在一天结束时我有一个像
这样的数组
Array
(
[0] => 12
[1] => jan
)
我们将不胜感激。
如果您在评论中回答我的问题,这可能会得到优化。
模式:~(?<=[0-9])[*/ ]*(?=[a-z]+)~i
以上将匹配零个或多个 *
、/
and/or space 个字符。
在您的输入字符串上,这将同样准确且更快:
模式:~\d+\K[^a-z]*~i
或者:~\d+\K[*/ ]*~
(不需要 case-sensitive 模式修饰符)
以上将匹配紧跟在前导数字之后的零个或多个 non-alphabetical 个字符。
当然preg_split
的表兄弟们也可以做得很好:
$strings=['12jan','12 jan','12 jan','12/jan','12//jan','12/jan','12*/jan','12*//jan'];
foreach($strings as $string){
var_export(preg_split('~(?<=[0-9])[*/ ]*(?=[a-z]+)~i',$string));
echo "\n";
var_export(preg_split('~\d+\K[*/ ]*~',$string));
echo "\n";
var_export(preg_match('~(\d+)[/* ]*([a-z]+)~i',$string,$out)?array_slice($out,1):'fail');
echo "\n";
var_export(preg_match('~(\d+)[/* ]*(.+)~',$string,$out)?array_slice($out,1):'fail');
echo "\n";
var_export(preg_match_all('~\d+|[a-z]+~i',$string,$out)?$out[0]:'fail');
echo "\n---\n";
}
所有方法都提供相同的输出。
我已经用 preg_match 更新了你的代码
它给出的输出正是您所需要的
$str='12/jan';
preg_match('/^(\d*)[\*\s\/]*([a-z]{3})$/i', $str, $match);
print_r($match);
但是输出有点变化,会像下面这样
array(
0 => '12/jan',
1 => '12',
2 => 'jan'
)
一个简单的 preg_match 正则表达式就可以做到:
foreach (['12 jan', '12 jan', '12/jan', '12//jan', '12/jan',
'12*/jan', '12*//jan'] as $test)
{
unset ($matches);
if (preg_match("#^([0-9]+)[ /*]*(.*)#", $test, $matches)) {
var_export( [$matches[1], $matches[2]] );
}
else {
print "Failed for '$test'.\n";
}
}
正则表达式是:
- 从数字开始 -> 第 1 组
- 有 0 个或多个 space、斜线或星号
- 剩下的全部拿走 -> 第 2 组
为了在前面是数字后面是字母的点处拆分我的字符串,如:
$str = '12jan';
我用过
$arr = preg_split('/(?<=[0-9])(?=[a-z]+)/i',$str);
它可以运行文件并提供所需的输出。我想更新它,以便它为类似字符串提供相同的输出。
$str='12 jan';
$str='12 jan';
$str='12/jan';
$str='12//jan';
$str='12/jan';
$str='12*/jan';
$str='12*//jan';
代码应该适用于上面给出的任何字符串,所以在一天结束时我有一个像
这样的数组Array
(
[0] => 12
[1] => jan
)
我们将不胜感激。
如果您在评论中回答我的问题,这可能会得到优化。
模式:~(?<=[0-9])[*/ ]*(?=[a-z]+)~i
以上将匹配零个或多个 *
、/
and/or space 个字符。
在您的输入字符串上,这将同样准确且更快:
模式:~\d+\K[^a-z]*~i
或者:~\d+\K[*/ ]*~
(不需要 case-sensitive 模式修饰符)
以上将匹配紧跟在前导数字之后的零个或多个 non-alphabetical 个字符。
当然preg_split
的表兄弟们也可以做得很好:
$strings=['12jan','12 jan','12 jan','12/jan','12//jan','12/jan','12*/jan','12*//jan'];
foreach($strings as $string){
var_export(preg_split('~(?<=[0-9])[*/ ]*(?=[a-z]+)~i',$string));
echo "\n";
var_export(preg_split('~\d+\K[*/ ]*~',$string));
echo "\n";
var_export(preg_match('~(\d+)[/* ]*([a-z]+)~i',$string,$out)?array_slice($out,1):'fail');
echo "\n";
var_export(preg_match('~(\d+)[/* ]*(.+)~',$string,$out)?array_slice($out,1):'fail');
echo "\n";
var_export(preg_match_all('~\d+|[a-z]+~i',$string,$out)?$out[0]:'fail');
echo "\n---\n";
}
所有方法都提供相同的输出。
我已经用 preg_match 更新了你的代码 它给出的输出正是您所需要的
$str='12/jan';
preg_match('/^(\d*)[\*\s\/]*([a-z]{3})$/i', $str, $match);
print_r($match);
但是输出有点变化,会像下面这样
array(
0 => '12/jan',
1 => '12',
2 => 'jan'
)
一个简单的 preg_match 正则表达式就可以做到:
foreach (['12 jan', '12 jan', '12/jan', '12//jan', '12/jan',
'12*/jan', '12*//jan'] as $test)
{
unset ($matches);
if (preg_match("#^([0-9]+)[ /*]*(.*)#", $test, $matches)) {
var_export( [$matches[1], $matches[2]] );
}
else {
print "Failed for '$test'.\n";
}
}
正则表达式是:
- 从数字开始 -> 第 1 组
- 有 0 个或多个 space、斜线或星号
- 剩下的全部拿走 -> 第 2 组