php preg_split 没有松散的文本,.: 等等
php preg_split a text without loose ,.: and so forth
我尝试用 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 => '...',
)
一件事是,开头 ( 在第一个解决方案中不匹配。另一件事是,也不是单词内的德语字符 ÄÖÜäöüß 不匹配。
希望更新问题没问题(不是开新问题)
我的 last try 不匹配:
\s+|(?<!(A-Za-z1-0ÄÖÜäöüß)+)(?=(A-Za-z1-0ÄÖÜäöüß)+)
您可以使用这个基于前瞻的正则表达式:
$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+ 水平 space 或前一个字符不是非字字符且下一个字符是非字字符的位置处拆分。
交替的 RHS 是 (?<!\W)(?=\W)
,其中 (?<!\W)
是负向后视,这意味着前一个字符不是非字字符。然后 (?=\W)
是积极的前瞻,这意味着下一个字符是一个非单词字符。
我认为除了 '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
);
我尝试用 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 => '...',
)
一件事是,开头 ( 在第一个解决方案中不匹配。另一件事是,也不是单词内的德语字符 ÄÖÜäöüß 不匹配。
希望更新问题没问题(不是开新问题)
我的 last try 不匹配:
\s+|(?<!(A-Za-z1-0ÄÖÜäöüß)+)(?=(A-Za-z1-0ÄÖÜäöüß)+)
您可以使用这个基于前瞻的正则表达式:
$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+ 水平 space 或前一个字符不是非字字符且下一个字符是非字字符的位置处拆分。
交替的 RHS 是 (?<!\W)(?=\W)
,其中 (?<!\W)
是负向后视,这意味着前一个字符不是非字字符。然后 (?=\W)
是积极的前瞻,这意味着下一个字符是一个非单词字符。
我认为除了 '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
);