我一直在使用
explode(".",$mystring)
将段落拆分为句子。但是,这不包括以不同标点符号结束的句子,例如!? : ;
有没有办法使用数组作为分隔符而不是单个字符?或者是否有另一种使用各种标点符号进行拆分的巧妙方法?
我试过了
explode(("." || "?" || "!"),$mystring)
希望,但它没有工作......
我一直在使用
explode(".",$mystring)
将段落拆分为句子。但是,这不包括以不同标点符号结束的句子,例如!? : ;
有没有办法使用数组作为分隔符而不是单个字符?或者是否有另一种使用各种标点符号进行拆分的巧妙方法?
我试过了
explode(("." || "?" || "!"),$mystring)
希望,但它没有工作......
您可以preg_split()
结合PCRE 前瞻条件.
在每次出现, ;
, :
, ?
, , ..后拆分字符串!
,同时保持实际标点符号完整:
代码:
$subject = 'abc sdfs. def ghi; this is an.email@addre.ss! asdasdasd? abc xyz';
// split on whitespace between sentences preceded by a punctuation mark
$result = preg_split('/(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);
结果:
Array
(
[0] => abc sdfs.
[1] => def ghi;
[2] => this is an.email@addre.ss!
[3] => asdasdasd?
[4] => abc xyz
)
您还可以通过插入否定的lookbehind断言来为不应拆分为自己的句子的缩写词(先生、夫人、博士、..)添加黑名单:
$subject = 'abc sdfs. Dr. Foo said he is not a sentence; asdasdasd? abc xyz';
// split on whitespace between sentences preceded by a punctuation mark
$result = preg_split('/(?<!Mr.|Mrs.|Dr.)(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);
结果:
Array
(
[0] => abc sdfs.
[1] => Dr. Foo said he is not a sentence;
[2] => asdasdasd?
[3] => abc xyz
)
你可以做:
preg_split('/\.|\?|!/',$mystring);
或(更简单):
preg_split('/[.?!]/',$mystring);
假设您实际上想要带有最终结果的标点符号,您是否尝试过:
$mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring)));
$tmp = explode("---",$mystring);
这将使您的标点符号保持完整。
preg_split('/\s+|[.?!]/',$string);
一个可能的问题可能是如果有一个电子邮件地址,因为它可能会在中途将其拆分到一个新行。
使用preg_split并给它一个像 [\.|\?!] 这样的正则表达式来分割
$mylist = preg_split("/[.?!:;]/", $mystring);
爆炸不能有多个分隔符。这preg_split();
就是为了。但即便如此,它也会在分隔符处爆炸,因此您将返回没有标点符号的句子。您可以更进一步地使用 preg_split 并将其标记为使用 PREG_SPLIT_DELIM_CAPTURE 在它们自己的元素中返回它们,然后运行一些循环来爆破句子并在返回的数组中跟随标点符号,或者只使用preg_match_all();
:
preg_match_all('~.*?[?.!]~s', $string, $sentences);
你可以试试preg_split
$sentences = preg_split("/[.?!:;]+/", $mystring);
请注意,这将删除标点符号。如果您还想去掉前导或尾随空格
$sentences = preg_split("/[.?!:;]+\s+?/", $mystring);