用PHP的preg_split函数如何分割一个文本,使其不丢失逗号、句号等标点符号?

3
我将尝试使用 preg_split 分割一个文本,但我不知道如何编写正则表达式。
示例:
I search 1, regex to:  no. Or... yes!

应该得到:

Array
(
    [0] => I
    [1] => search
    [2] => 1
    [3] => ,
    [4] => regex
    [5] => to
    [6] => :
    [7] => no
    [8] => .
    [9] => Or
    [10] => ...
    [11] => yes
    [12] => !
)

我尝试了以下代码:

我尝试了以下代码:

preg_split("/([\s]+)/", "I search 1, regex to:  no. Or... yes!")

以以下结尾:

Array
(
    [0] => I
    [1] => search
    [2] => 1,
    [3] => regex
    [4] => to:
    [5] => no.
    [6] => Or...
    [7] => yes!
)

编辑:好的,原问题已经解决,但我在我的示例中忘记了一些东西:

新的示例:

I search 1, regex (regular expression) to: That's it is! Und über den Wolken müssen wir...

应该获得:

array (
  0 => 'I',
  1 => 'search',
  2 => '1',
  3 => ',',
  4 => 'regex',
  5 => '(',
  6 => 'regular',
  7 => 'expression',
  8 => ')',
  9 => 'to',
  10 => ':',
  11 => 'That',
  12 => '\'s',
  13 => 'it',
  14 => 'is',
  15 => '!',
  16 => 'Und',
  17 => 'über',
  18 => 'den',
  19 => 'Wolken',
  20 => 'müssen',
  21 => 'wir',
  22 => '...',
)

有一件事是,在第一种解决方案中,括号()未匹配。另一件事是,在单词中也无法匹配德语字符ÄÖÜäöüß。

希望能更新问题(而不是新开一个问题)。

我的最后一次尝试的结果如下,不能匹配:

\s+|(?<!(A-Za-z1-0ÄÖÜäöüß)+)(?=(A-Za-z1-0ÄÖÜäöüß)+)

我尝试了,但是你现在用哪个代码得到了什么? - Rizier123
抱歉,我不知道如何使正向先行断言起作用。我只能使用"/[\s]+/",它会将所有内容都削减掉 :( - Thomas
1
这是一个好的开始!请将您当前的代码包含在问题中,这样我们就可以看到您尝试了什么,并且可以更好地向您展示您犯了哪些错误。 - Rizier123
我在以下链接中编写了一个简单的测试脚本:link - Thomas
你的代码应该在问题中,不要使用外部链接。 - DavidPostill
显示剩余2条评论
2个回答

4
你可以使用这个基于预测的正则表达式:
$str = 'I search 1, regex to: no. Or... yes!';
$tok = preg_split('/\h+|(?<!\W)(?=\W)/', $str);

print_r($tok);

Array
(
    [0] => I
    [1] => search
    [2] => 1
    [3] => ,
    [4] => regex
    [5] => to
    [6] => :
    [7] => no
    [8] => .
    [9] => Or
    [10] => ...
    [11] => yes
    [12] => !
)

/\h+|(?<!\W)(?=\W) 是基于交替的正则表达式,它会在1个或多个水平空格或前一个字符不是非单词字符且下一个字符是非单词字符的位置进行分割。

交替的右侧是 (?<!\W)(?=\W),其中 (?<!\W) 是负向先行断言,表示前一个字符不是非单词字符。然后 (?=\W) 是正向先行断言,表示下一个字符是非单词字符。


1
是的,我刚刚在我的答案中添加了它。 - anubhava
不客气。我已经添加了一些关于预测的更多细节。 - anubhava
好的,我忘记了一件事——一个括号的文本。我尝试自己找到解决方案。但如果找不到,我会添加新评论 :) - Thomas
好的,我不明白 :( 希望有人能看一下我的更新问题。 - Thomas
作为公平的做法,请不要在接受的答案上更新问题并更改要求。如果您有新的问题,请毫不犹豫地发布一个新的问题。我还注意到您已经删除了接受标记,这是基于您最初的要求并完全解决了您的问题。 - anubhava
显示剩余3条评论

1

我认为除了你似乎想要作为一个整体的's部分之外,这对我来说并没有太多意义,因为对于其他标点符号字符,例如,,你希望它们是单独的部分,你可以通过在任何空格或单词边界处简单地拆分来完成。

preg_split(
  '#\s|\b#u',
  "I search 1, regex (regular expression) to: That's it is! Und über den Wolken müssen wir...",
  -1,
  PREG_SPLIT_NO_EMPTY
);

谢谢 - 现在它可以工作了 - 使用 's 我可以生存 :) 链接 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接