拆分包含字母和数字的字符串,不用PHP中的任何特定分隔符分隔

时间:2012-04-16 19:55:40

标签: php regex string algorithm nlp

目前我正在开发一个Web应用程序来获取Twitter流并试图通过我自己创建一个自然语言处理。

由于我的数据来自Twitter(限制为140个字符),因此缩短了许多单词,或者在这种情况下,省略了空格

例如:

"Hi, my name is Bob. I m 19yo and 170cm tall"

应该被标记为:

- hi
- my
- name
- bob
- i
- 19
- yo
- 170
- cm
- tall

请注意19中的yo19yo之间有无空格。我主要用它来提取单位数。

简单地说,我需要的是一种“爆炸”每个令牌的方法,其中包含大量数字或字母没有分隔符。

'123abc'将为['123', 'abc']

'abc123'将为['abc', '123']

'abc123xyz'将为['abc', '123', 'xyz']

等等。

在PHP中实现它的最佳方法是什么?


我找到了接近它的东西,但它是C#,特别是日/月分裂。 How do I split a string in C# based on letters and numbers

2 个答案:

答案 0 :(得分:7)

您可以使用preg_split

$string = "Hi, my name is Bob. I m 19yo and 170cm tall";
$parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $string);
var_dump ($parts);

当匹配数字字母边界时,正则表达式匹配必须为零宽度。角色本身不得包含在比赛中。为此,zero-width lookarounds很有用。

http://codepad.org/i4Y6r6VS

答案 1 :(得分:1)

怎么样:

通过使用正则表达式从字符串中提取数字,将它们存储在数组中,用一些特殊字符替换字符串中的数字,这将“保持”它们的位置。解析仅由您的特殊字符和普通字符创建的字符串后,您将把数字从数组提供给他们保留的地方。

只是一个想法,但imho可能适合你。

编辑: 尝试运行这个简短的代码,希望你会在输出中看到我的观点。 (这段代码在键盘上不起作用,不知道为什么)

<?php
$str = "Hi, my name is Bob. I m 19yo and 170cm tall";
preg_match_all("#\d+#", $str, $matches);
$str = preg_replace("!\d+!", "#SPEC#", $str);

print_r($matches[0]);
print $str;