如何使用文本前后的动态符号解析复杂的字符串

时间:2013-10-02 08:07:51

标签: php

2-(Диметиламино) этанол (2-(Dimethylamino)ethanol): инструкция по применению, противопоказания и состав

我有这个字符串,我想用包含空格的数字和所有符号解析西里尔字母名称,包括可能是2-(Диметиламино)的空格和拉丁名称(2-(Dimethylamino)ethanol)

但每次名称不同时,

13-цис-Ретиноевая кислота (13-cys-Retinoic acid): инструкция по применению, противопоказания и состав

现在西里尔字母名称为13-цис-Ретиноевая кислота,拉丁语为(13-cys-Retinoic acid)

我正在用它来解析它:

preg_match ('/[\p{Cyrillic}]+/u', $chemical_text, $matches);

preg_match('/[\p{Latin}]+/u', $chemical_text, $matches);

我不知道的是如何解析那些带有符号-, _, @, (, )等符号的名称等等

任何想法?

1 个答案:

答案 0 :(得分:2)

你可能不需要过多关注这些符号。可以使用

解析此类输入
/(.*)\s+\((?=\P{Cyrillic}+:)([^:]*)\)/u

第一个捕获组(.*?)非贪婪地匹配西里尔文本直到出现空格和分隔符的点;那么正向前瞻(?=\P{Cyrillic}+:)确保从那一点开始直到下一个双冒号都没有西里尔文本。然后第二个捕获组([^:]*)贪婪地匹配它可以包含的所有内容,直到用于分隔英文名称的paren-and-double-colon组合。

更新:替代

/(\P{Latin}*)\s+\((\P{Cyrillic}*)\)\P{L}*\s+/u

此正则表达式匹配表单

的文本
<cyrillic> <whitespace> (<latin>) [symbols] <whitespace>

其中[symbols]可以选择显示。也许它更适合某些类型的投入。