我需要在每个句号,感叹号和问号上将文本拆分成数组。
带有全宽句号和感叹号的示例:
$string = "日本語を勉強しているみんなを応援したいです。一緒に頑張りましょう!";
我正在寻找以下输出:
Array (
[0] => 日本語を勉強しているみんなを応援したいです。
[1] => 一緒に頑張りましょう! )
我需要相同的代码才能使用半角。
全宽和半宽混合的示例: $ string ="嗨。我是鲍勃!很高兴见到你。日本语を勉强しています。你了解我吗?&#34 ;;
输出:
Array (
[0] => Hi.
[1] => I am Bob!
[2] => Nice to meet you.
[3] => 日本語を勉強しています。
[4] => Do you understand me? )
我很喜欢正则表达式,无法找到解决方案,也找不到解决方案。
我试过了:
$string = preg_split('(.*?[。?!])', $string);
答案 0 :(得分:6)
首先,你忘了你的分隔符(最常见的是斜杠)。
你可以在\pP
上拆分(一个unicode标点符号 - 记住u
修饰符意味着unicode):
您可以看到其余的特殊unicode字符here。
<?php
$str = 'Hi. I am Bob! Nice to meet you. 日本語を勉強しています。Do you understand me?';
$array = preg_split('/(?<=\pP)\s*/u', $str, null, PREG_SPLIT_NO_EMPTY);
print_r($array);
如果你的最后一个字符是标点符号,PREG_SPLIT_NO_EMPTY
就是为了确保我们不会包含空匹配。
<强>输出强>:
Array
(
[0] => Hi.
[1] => I am Bob!
[2] => Nice to meet you.
[3] => 日本語を勉強しています。
[4] => Do you understand me?
)
正则表达式尸检:
/
- 起始分隔符 - 这也必须在我们的修饰符之前结束 (?<=\pP)
- 一个正面的背后匹配\pP
(一个unicode标点符号 - 我们可以使用\pP
,但是标点符号不会包含在我们的最终字符串中 - a积极的外观包括它) \s*
- 一个空格字符,匹配0到无穷大时间 - 这是为了确保我们在标点符号后不包含空格 /u
- 结束分隔符(/
)和我们的修饰符(u
含义&#34; unicode&#34;) 您的第一句话会产生以下数组:
Array
(
[0] => 日本語を勉強しているみんなを応援したいです。
[1] => 一緒に頑張りましょう!
)
请注意,这包括所有标点符号,包括逗号。
Array
(
[0] => This is my sentence,
[1] => and it is very nice.
)
这可以通过在我们的正面观察面前使用负面观察来解决:
/(?<![,、;;"”\'’``])(?<=\pP)\s*/u