我需要在每个时段,感叹号和问号将我的文本拆分成一个数组.
带有全宽周期和感叹号的示例:
$string = "?????????????????????????????????";
Run Code Online (Sandbox Code Playgroud)
我正在寻找以下输出:
Array (
[0] => ??????????????????????
[1] => ??????????? )
Run Code Online (Sandbox Code Playgroud)
我需要相同的代码才能使用半宽.
全宽和半宽混合的例子:$ string ="嗨.我是鲍勃!很高兴认识你.日本语を勉强しています.你了解我吗?";
输出:
Array (
[0] => Hi.
[1] => I am Bob!
[2] => Nice to meet you.
[3] => ????????????
[4] => Do you understand me? )
Run Code Online (Sandbox Code Playgroud)
我吮吸正则表达式,无法找到解决方案,也找不到解决方案.
我试过了:
$string = preg_split('(.*?[???])', $string);
Run Code Online (Sandbox Code Playgroud)
首先,你忘了你的分隔符(最常见的是斜线).
你可以分开\pP(一个unicode标点符号 - 记住u修饰符意味着unicode):
您可以在此处查看其余的特殊unicode字符.
<?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);
Run Code Online (Sandbox Code Playgroud)
该PREG_SPLIT_NO_EMPTY是有,以确保如果你的最后一个字符是标点符号不包括空匹配.
输出:
Array
(
[0] => Hi.
[1] => I am Bob!
[2] => Nice to meet you.
[3] => ????????????
[4] => Do you understand me?
)
Run Code Online (Sandbox Code Playgroud)
正则表达式尸检:
/- 起始分隔符 - 这也必须在我们的修饰符之前结束(?<=\pP)- 一个积极的lookbehind匹配\pP(unicode标点符号 - 我们可以使用\pP,但是标点符号不会包含在我们的最终字符串中 - 正面的lookbehind包含它)\s*- 一个匹配0到无穷大时间的空白字符 - 这是为了确保标点符号后我们不包含空格/u- 结束分隔符(/)和我们的修饰符(u意思是"unicode")你的第一句话会产生以下数组:
Array
(
[0] => ??????????????????????
[1] => ???????????
)
Run Code Online (Sandbox Code Playgroud)
请注意,这包括所有标点符号,包括逗号.
Array
(
[0] => This is my sentence,
[1] => and it is very nice.
)
Run Code Online (Sandbox Code Playgroud)
这可以通过在我们的正面观察背后使用负面观察来解决:
/(?<![,?;?"”\'’?`])(?<=\pP)\s*/u
Run Code Online (Sandbox Code Playgroud)