Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在preg_split()的结果中包含拆分分隔符?_Php_Preg Split - Fatal编程技术网

Php 如何在preg_split()的结果中包含拆分分隔符?

Php 如何在preg_split()的结果中包含拆分分隔符?,php,preg-split,Php,Preg Split,我有一个简单的模式,将文本拆分为句点: $text = preg_split("/[\.:!\?]+/", $text); 但我想包括:或位于数组项的末尾 也就是说,现在是“好消息,各位!”我有: 但我想: array("good:", "news.", "everyone!", ""); 给你: preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT

我有一个简单的模式,将文本拆分为句点:

$text = preg_split("/[\.:!\?]+/", $text);
但我想包括
位于数组项的末尾

也就是说,现在是“好消息,各位!”我有:

但我想:

array("good:", "news.", "everyone!", "");
给你:

preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
工作原理:该模式实际上将所有内容都转换为分隔符。然后,要在数组中包含这些分隔符,可以使用
PREG\u SPLIT\u DELIM\u CAPTURE
常量。这将返回如下数组:

array (
    0 => '',
    1 => 'good:',
    2 => '',
    3 => 'news.',
    4 => '',
    5 => 'everyone!',
    6 => '',
);
要去除空值,请使用
PREG\u SPLIT\u NO\u empty
。要组合这两个或多个常量,我们使用按位
|
运算符。结果是:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);

如果在模式中使用a,则不使用
PREG\u SPLIT\u DELIM\u CAPTURE
。函数将保留分隔符

$text = preg_split('/(?<=[.:!?])/', 'good:news.everyone!', 0, PREG_SPLIT_NO_EMPTY);
带有
PREG\u SPLIT\u NO\u EMPTY
标志的结果:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!',
    3 => ''
);
array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);

您可以使用这个来测试它。

若我需要将“good:”作为整个单词拆分为:?我还可以在中添加标记吗?因此,我需要的是好:@user1551496:那么您正在处理标记。使用解析器而不是正则表达式,因为@NinoŠkopac:
[^.:!]+
贪婪地匹配所有字符,除了
一次或多次,下一个字符组贪婪地匹配
一次或多次。这两个字符类是分组的,因为模式将它们包装在
()
中,因此结果是匹配所有字符。但是,只要一个或多个
时,下一个匹配项在新组中被保留,因此数组->匹配,空,匹配,空。。。使用
PREG\u SPLIT\u DELIM\u CAPTURE
,您可以确保用作分隔符的匹配项在数组中,
PREG\u SPLIT\u NO\u EMPTY
从本质上去除空位,字符串中的每个部分都是分隔符,您可以分割空字符串。忽略空字符串,并要求
preg_split
为您提供匹配的分隔符,这就是OP之后的内容。您还可以使用?=而不是?
array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);