1

我有很多文字,类似于以下段落,我想将其拆分为不带标点符号的单词(', ", ,, .,newline等).. 除了少数例外。

最初被认为是印度南部喀拉拉邦查拉库迪河系统的特有种,但现在被认为在包括 Periyar、Manimala 和 Pamba 河在内的周边排水系统中有更广泛的分布,尽管 Manimala 数据可能有问题,因为它似乎是典型产地P. denisonii。

在 Achankovil 河流域,它与 P. denisonii 同域出现,有时同域出现。

在过去 15 年左右的时间里,野生种群可能减少了多达 50%,尽管栖息地也因农业和国内污染以及涉及爆炸物或有机毒素的破坏性捕鱼方法而退化,但主要是为水族馆贸易负责.

文中指的P. denisonii是鱼的一种。是 的缩写Genus species。我希望这个参考是一个词。

因此,例如,这是我希望看到的那种数组:

Array
(
    ...
    [44] given
    [45] it
    [46] seems
    [47] to
    [48] be
    [49] the
    [50] type
    [51] locality
    [52] of
    [53] P. denisonii
    [54] In
    [55] the
    ...
)

唯一能区分这些物种参考的东西,比如P. denisonii一个新句子,比如end. New

  • P(对于 Puntius,如上述示例中的 P.)只有一个字母,始终是大写字母
  • d(如 .denisonii)始终是小写字母或撇号 ( ')

我可以使用什么正则表达式preg_split来给我这样一个数组?我尝试了一个简单的方法explode( " ", $array ),但它根本不起作用。

提前致谢,

4

1 回答 1

2

改变你的方法:为什么不使用preg_match_all而不是preg_split?您将匹配所有包含分隔符的字符串,而不是使用拆分分隔符拆分文本。

将其与正则表达式一起使用:/([\S]+)|(P. denisonii)/匹配所有非空白序列和序列“P. denisonii”

要排除逗号、引号、句号和其他字符,只需将 \S 替换为负正则表达式字符列表[^...]

/([^\s,\.\"]+)|(P. denisonii)/匹配所有不包含空格 ( \s)、逗号、引号和点 ( \.)的序列

编辑:匹配通用属名(注意:我已更改您的文本以更好地测试代码,包括引号和虚假属名)

$text = "Initially considered \"endemic\" to the Chalakudy River system in Kerala state, southern India, but now recognised to have a wider distribution in surrounding drainages including the Periyar, Manimala, and Pamba river though the Manimala data may be questionable given it seems to be the type locality of P. denisonii.

This is a bogus genus name, A. testii.

In the Achankovil River basin it occurs sympatrically, and sometimes syntopically, with P. denisonii.

Wild stocks may have dwindled by as much as 50% in the last 15 years or so with collection for the aquarium trade largely held responsible although habitats are also being degraded by pollution from agricultural and domestic sources, plus destructive fishing methods involving explosives or organic toxins.";


preg_match_all("/([A-Z]\. [a-z]+)|([^\s,\.\"]+)/", $text, $matches, PREG_PATTERN_ORDER);

echo "<pre>";
print_r($matches);

注意:您应该选择的数组是$matches[0],而不是$matches

于 2012-06-16T15:06:14.057 回答