PHP:在字符串中用空格分隔字母数字单词

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

如何在一个语句中用空格分隔字母数字值

示例:

$arr="new stackoverflow 244code 7490script design"; 

那么如何用 spacealpha 和 number 分开,如下所示:

$arr="new stackoverflow 244 code 7490 script design";
php regex preg-replace
5个回答
2
投票

您可以使用preg_split()函数

检查 演示 Codeviper

preg_split('#(?<=\d)(?=[a-z])#i', "new stackoverflow 244code 7490script design");

PHP

print_r(preg_split('#(?<=\d)(?=[a-z])#i', "new stackoverflow 244code 7490script design"));

结果

Array ( [0] => new stackoverflow 244 [1] => code 7490 [2] => script design )

您还可以使用preg_replace()函数

检查 演示 Codeviper

PHP

echo preg_replace('#(?<=\d)(?=[a-z])#i', ' ', "new stackoverflow 244code 7490script design");

结果

new stackoverflow 244 code 7490 script design

希望这对您有帮助!


1
投票

您可以使用preg_replace示例):

$arr = "new stackoverflow 244code 7490script design"; 
$newstr = preg_replace('#(?<=\d)(?=[a-z])#i', ' ', $arr);
echo $newstr; // new stackoverflow 244 code 7490 script design

regex pattern
来自
user1153551
的答案。


1
投票

像这样使用

preg_replace

$new = preg_replace('/(\d)([a-z])/i', "$1 $2", $arr);

regex101 演示

(\d)
匹配并捕获一个数字。
([a-z])
匹配并接住一封信。在替换中,它放回数字,添加空格并放回字母。


如果你不想使用反向引用,你可以使用lookarounds:

$new = preg_replace('/(?<=\d)(?=[a-z])/i', ' ', $arr);

如果您还想在字母和数字之间进行替换...

$new = preg_replace('/(?<=\d)(?=[a-z])|(?<=[a-z])(?=\d)/i', ' ', $arr);

regex101 演示

(?<=\d)
是正向后查找,确保当前位置之前有一个数字。

(?=[a-z])
是正向前瞻,确保当前位置后面有一个字母。

同样,

(?<=[a-z])
确保当前位置之前有一个字母,
(?=\d)
确保当前位置之后有一个数字。


另一种选择是拆分并用空格重新连接:

$new_arr = preg_split('/(?<=\d)(?=[a-z])/i', $arr);
$new = implode(' ', $new_arr);

或者...

$new = implode(' ', preg_split('/(?<=\d)(?=[a-z])/i', $arr));

0
投票

preg_split

preg_split — 通过正则表达式分割字符串

<?php

      // split the phrase by any number of commas or space characters,
     // which include " ", \r, \t, \n and \f

    $matches = preg_split('#(?<=\d)(?=[a-z])#i', "new stackoverflow 244code 7490script design");

    echo $matches['0'],' '.$matches['1'].' '.$matches['2'];



    ?>

工作演示


0
投票

我不赞成在这项任务中使用

preg_split()
,它只会在最终修复输入字符串之前做更多的工作。

preg_replace()
也是正确的,但是在每个步骤上使用两个环视将使正则表达式引擎比它需要的更加努力地工作。为了获得最佳效率,请贪婪地匹配一个或多个数字,用
\K
忘记它们,然后向前查找单个字母。

而不是

/(?<=\d)(?=[a-z])/i
在输入字符串上需要 87 个步骤

使用

/\d\K(?=[a-z])/i
在输入字符串上仅需要 32 个步骤

PHP 代码:(演示

$string = 'new stackoverflow 244code 7490script design';
echo preg_replace('/\d+\K(?=[a-z])/i', ' ', $string);
// new stackoverflow 244 code 7490 script design
© www.soinside.com 2019 - 2024. All rights reserved.