2013-01-10 146 views
0

我有这个模式来preg_match_all:/(<span[^>]*value=.?(\w*).?[^>]*annotation[^>]*>)(.*?)<\/span>/,对本文工作:preg_match_all误差 n(换行符)

example<span id="Marky100120131906070" class="myMarkGen" value="247" name="annotation">logy.*-/+!\"·$%&/()=?¿hi </span>example 

但这并不在这种情况下工作:

example<span id="Marky100120131906070" class="myMarkGen" value="247" name="annotation">logy.*-/+!\" 

·$%&/()=?¿hi </span>example 

注有一个换行符

在两种情况下都可以工作的模式是什么,并且无论跨度的内容如何都可以工作?我需要文本以跨度和范围值

你可以尝试here

回答

3

加上修饰语它会做:

/(<span[^>]*value=.?(\w*).?[^>]*annotation[^>]*>)(.*?)<\/span>/smi 
+0

由于它的工作!你能解释一下这个/ smi吗?它有什么用途? – Martin

+1

@Martin请参阅此[链接](http://php.net/manual/en/reference.pcre.pattern.modifiers.php)以获得解释。其实,我想你可以使用multilne('m')修饰符,对不对? – David

+0

@Martin你需要s修饰符(如果设置了这个修饰符,模式中的一个点元字符匹配所有的字符,包括换行符,如果没有它,换行符将被排除),我更喜欢s + m,当m被设置时,紧接在主题字符串中的任何换行符之后/之前的“行首”和“行尾”结构匹配。我只是代表无视情况,所以无论你是大写字母还是小写字母。 –