php正则表达式-提取特定字符前的所有文本

php正则表达式-提取特定字符前的所有文本,php,regex,Php,Regex,我正在尝试从字符串中提取发布者信息。它有多种格式,例如: 约翰·威利父子出版社(1995),平装本,154页 纽约,克劳威尔[1963]viii,第373页。伊卢。20厘米 纽约:班塔姆图书,c1990。xx,444页:生病的27厘米 纽约花园城,双日,1963年。142页。伊卢。22厘米。[第1版] 我只想提取出版商的名称,所以[可以忽略。但是,我需要在这之前抓取任何字符。这很复杂,因为例如3,我想抓取逗号之前的信息,但在示例2中,我只想抓取方括号之前的信息,如果可能的话,保留逗号 我愿意使用

我正在尝试从字符串中提取发布者信息。它有多种格式,例如:

约翰·威利父子出版社(1995),平装本,154页

纽约,克劳威尔[1963]viii,第373页。伊卢。20厘米

纽约:班塔姆图书,c1990。xx,444页:生病的27厘米

纽约花园城,双日,1963年。142页。伊卢。22厘米。[第1版]

我只想提取出版商的名称,所以[可以忽略。但是,我需要在这之前抓取任何字符。这很复杂,因为例如3,我想抓取逗号之前的信息,但在示例2中,我只想抓取方括号之前的信息,如果可能的话,保留逗号

我愿意使用一个包含所有内容的正则表达式([和],并处理任何不完善的数据(例如,只获取“纽约”示例2),因为我不想将示例3的所有内容都插入数据库。大多数数据都在括号中,如例1和例2所示

提前感谢您的建议!

这里有一个:
#(.+?)\W*\d{4}#

生成(如上所示):

它基本上提取序列[任意数量的非单词字符+1个字符+4位字符串(希望是年份)]之前的所有内容。

这里有一个:
#(.+?)\W*\d{4}#

生成(如上所示):


它基本上提取序列之前的所有内容[任意数量的非单词字符+1个字符+4位字符串(希望是年份)]。

Hm替换:

[^\w\n\r]+c?[12]\d{3}.*
使用空字符串?说明:

[^\w\n\r]+   # any non-word character (but no new lines either!)
c?           # an optional "c"
[12]\d{3}    # a year (probably, at least)
.*           # all the rest of the line

适用于您的示例,可能需要进行一些额外调整。

Hm更换:

[^\w\n\r]+c?[12]\d{3}.*
使用空字符串?说明:

[^\w\n\r]+   # any non-word character (but no new lines either!)
c?           # an optional "c"
[12]\d{3}    # a year (probably, at least)
.*           # all the rest of the line

适用于您的示例,可能需要进行一些额外的调整。

+1.可能需要使用正则表达式尽可能接近。但是为什么要在多行模式下运行它?我没有看到任何线锚。@Alan:是的,这是一个编辑工件。:)我会把它拿出来,我只是忘了做。太好了。这个很好用。另一个答案看起来也很好,但是这个答案需要最少的调整来适应我的代码。非常感谢!+1。也许你可以用正则表达式尽可能地接近它。但是为什么你说要在多行模式下运行它?我看不到任何线锚。@Alan:是的,那是这是一个编辑工件。:)我会把它拿出来,我只是忘了做。太好了。这个工作非常完美。另一个答案看起来也很有效,但这个需要最少的调整来适应我的代码。非常感谢!