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:[^.:!]+
贪婪地匹配所有字符,除了:代码>一次或多次,下一个字符组贪婪地匹配:代码>一次或多次。这两个字符类是分组的,因为模式将它们包装在()
中,因此结果是匹配所有字符。但是,只要一个或多个:遇到code>时,下一个匹配项在新组中被保留,因此数组->匹配,空,匹配,空。。。使用PREG\u SPLIT\u DELIM\u CAPTURE
,您可以确保用作分隔符的匹配项在数组中,PREG\u SPLIT\u NO\u EMPTY
从本质上去除空位,字符串中的每个部分都是分隔符,您可以分割空字符串。忽略空字符串,并要求preg_split
为您提供匹配的分隔符,这就是OP之后的内容。您还可以使用?=而不是?
array (
0 => 'good:',
1 => 'news.',
2 => 'everyone!'
);