我有一个像这样的字符串
$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,
],
]
答案 0 :(得分:3)
您可以使用word boundary \b
:
$string = "Hello; how are you;Hey, I am fine";
$new = preg_split("/\b;\b/", $string);
print_r($new);
负面lookahead和负面反对
答案 1 :(得分:1)
Lookarounds花费更多的步骤。在模式效率方面,单词边界更好并且保持预期的"无长度"人物消费。
在结构良好的英语中,你不可能在分号之前检查一个空格,所以只有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