我一直在使用
explode(".",$mystring)
将一个段落分成句子。然而,这并不包括以不同的标点符号结束的句子,例如! ? :;
有没有办法使用数组作为分隔符而不是单个字符?另外还有另一种利用各种标点符号分割的巧妙方法吗?
我试过
explode(("." || "?" || "!"),$mystring)
希望但它不起作用......
答案 0 :(得分:11)
在.
,;
,:
,?
每次出现后,您都可以使用preg_split()
与PCRE lookahead condition相结合来分割字符串,!
,..同时保持实际的标点符号完整:
代码:
$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
)
答案 1 :(得分:6)
你可以这样做:
preg_split('/\.|\?|!/',$mystring);
或(更简单):
preg_split('/[.?!]/',$mystring);
答案 2 :(得分:2)
假设您确实希望标点符号带有最终结果,您是否尝试过:
$mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring)));
$tmp = explode("---",$mystring);
哪会留下你的标点符号。
答案 3 :(得分:1)
preg_split('/\s+|[.?!]/',$string);
如果有电子邮件地址可能会出现问题,因为它可能会在中途将其拆分为新行。
答案 4 :(得分:0)
使用preg_split并为其提供一个像[\。| \?!]这样的正则表达式来分割
答案 5 :(得分:0)
$mylist = preg_split("/[\.|\?!:;]/", $mystring);
答案 6 :(得分:0)
您无法使用多个分隔符进行爆炸。这就是preg_split();
的用途。但即便如此,它会在分隔符处爆炸,因此您将获得没有标点符号的句子。
您可以将preg_split更进一步并标记它以使用PREG_SPLIT_DELIM_CAPTURE将它们返回到它们自己的元素中,然后运行一些循环来破坏句子并在返回的数组中跟随标点符号,或者只使用preg_match_all();
:
preg_match_all('~.*?[?.!]~s', $string, $sentences);
答案 7 :(得分:0)
您可以尝试preg_split
$sentences = preg_split("/[\.\?\!,;]+/", $mystring);
请注意这将删除标点符号。如果你想删除前导或尾随空格
$sentences = preg_split("/[\.\?\!,;]+\s+?/", $mystring);