php分割半宽和全宽句子

Bry*_*jer 1 php regex

我需要在每个时段,感叹号和问号将我的文本拆分成一个数组.

带有全宽周期和感叹号的示例:

$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)

h2o*_*ooo 6

首先,你忘了你的分隔符(最常见的是斜线).

你可以分开\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")

DEMO

你的第一句话会产生以下数组:

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)