php split half-width&全宽句

时间:2014-05-31 17:22:37

标签: php regex

我需要在每个句号,感叹号和问号上将文本拆分成数组。

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

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

1 个答案:

答案 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;)

DEMO

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

Array
(
    [0] => 日本語を勉強しているみんなを応援したいです。
    [1] => 一緒に頑張りましょう!
)

请注意,这包括所有标点符号,包括逗号。

Array
(
    [0] => This is my sentence,
    [1] => and it is very nice.
)

这可以通过在我们的正面观察面前使用负面观察来解决:

/(?<![,、;;"”\'’``])(?<=\pP)\s*/u