2012-11-10 32 views
2

我有以下字符串的preg_match和新线符号

№ покупки(OrderId) : 12345 
Доп.Информация 1 : Имя 
Доп.Информация 2 : Уставная деятельность 

我想赶上与Доп.Информация 1开始行。

这一个工程:

Доп\.Информация 1\W*:\W*(\w*) 

这一个不:

^Доп\.Информация 1\W*:\W*(\w*)$ 

仅这一项工作:

^№ 

有什么不对?据我所知,^符号不仅用于字符串本身的开始搜索,而且还用于\n之后的符号。

+1

只有在多行模式下,它标志着字符串和任何行的开始(这也是字符串的开始)。默认情况下,这是*不是这种情况,你需要多行修饰符:['m(PCRE_MULTILINE)'](http://php.net/manual/en/reference.pcre.pattern.modifiers.php) – hakre

回答

1

仅当您使用多线模式时。你可以像这样激活它:

'/^Доп\.Информация 1\W*:\W*(\w*)$/m' 

只是把它放在你的分隔符后面(无论你用什么字符)。本文档的This part显示如何使用这些修饰符。

或者,可以在正则表达式中设置这些选项,甚至可以为它的各个部分设置这些选项(尽管在您的情况下可能不需要这些选项)。下面是它如何工作的:

'/(?m:^Доп\.Информация 1\W*:\W*(\w*)$)/' 

或者你也可以从某一点开始设置的修改是这样的:

'/(?m)^Доп\.Информация 1\W*:\W*(\w*)$/' 

对于这种风格,检查出的文档this bit

+1

您在代码示例中使用修饰符,而不是您链接的内部选项。只是说,你可以通过两种方式展示如何去做。尽管对于OP而言,它可能更多地是针对整个模式的修改器,而不仅仅是内部选项可用于的一部分。 – hakre

+0

@hakre谢谢!编辑答案 –

+0

谢谢,它的作品!我甚至不知道这种模式。但是'^Доп\。信息1 \ W *:\ W *(\ w *)$'不起作用,只有在catch组和$符号之间添加'\ W *'时才有效。为什么? '$'只匹配'\ n',而不是'\ r \ n'? – efpies

2

我建议使用多行模式/m,所以^$将适用于每行文本。

/^.* 1 : .*$/m 

其他替代方法是:

/(?:^|(?<=\n)).* 1 : .*/ 

(?:^|(?<=\n))比赛开始线的地方。