如何在不丢失角色的情况下preg_split?

时间:2018-05-07 15:00:31

标签: php regex

我有一个像这样的字符串

$string = "Hello; how are you;Hey, I am fine";
$new = preg_split("/;\w/", $string);
print_r($new);

我只是在单词和";"之间没有空格时才尝试拆分字符串。但是当我这样做时,我失去了嘿嘿。这可能是因为分裂是通过识别H而发生的。有人能告诉我如何防止这种情况吗?

我的输出:

$array  =   [
  0 => [
    0 => 'Hello; how are you ',
    1 => 0,
  ],
  1 => [
    0 => 'ey, I am fine',
    1 => 21,
  ],
]

4 个答案:

答案 0 :(得分:3)

您可以使用word boundary \b

\b;\b

$string = "Hello; how are you;Hey, I am fine";
$new = preg_split("/\b;\b/", $string);
print_r($new);

Demo

负面lookahead和负面反对

(?<! );(?! )

Demo

答案 1 :(得分:1)

Lookarounds花费更多的步骤。在模式效率方面,单词边界更好并且保持预期的&#34;无长度&#34;人物消费。

在结构良好的英语中,你不可能在分号之前检查一个空格,所以只有1个单词边界似乎就足够了(我不知道是否有可能出现格式错误的英语,因为它没有在您的示例字符串中表示。)

如果要获取偏移值,$string = "Hello; how are you;Hey, I am fine"; $new = preg_split("/;\b/", $string, -1, PREG_SPLIT_OFFSET_CAPTURE); var_export($new); 会有一个标记。

代码:(longobject.c

array (
  0 => 
  array (
    0 => 'Hello; how are you',
    1 => 0,
  ),
  1 => 
  array (
    0 => 'Hey, I am fine',
    1 => 19,
  ),
)

输出:

{{1}}

答案 2 :(得分:0)

你正在捕捉正则表达式中的\w。你不想要那个。因此,这样做:

$new = preg_split("/;(?=\w)/", $string);

捕获组在括号中定义,但?=表示匹配但不捕获。

请在此处查看https://3v4l.org/Q77LZ

答案 3 :(得分:0)

使用此正则表达式;(?=\w)进行拆分,那么您将不会丢失 H