2014-01-15 107 views
1

滑稽的正则表达式,我的最后一个问题是关于同一主题的,但很可惜:麻烦与PHP

我运行下面的代码:

preg_match('/<th.*>.*Organizer.*title=\".*\">(.*)<\/a>/mi', $file_string, $organizer); 

在下面的内容:

<tr> 
<th valign="top"> Organizer: 
</th> 
<td style="width:55%;"> <a href="/starcraft2/TaKe" title="TaKe">TaKe</a> 
</td></tr> 

我不能为了我的生活找出为什么它不起作用。我可以将它与主办单位匹配:使用正则表达式'/.*Organizer',但似乎只要有新行,就会停止工作,尽管有/ m选项。有任何想法吗?

+0

它的多行输出?因为你的正则表达式我不相信它应该遍历线,所以默认情况下它在一行上工作 – nrathaus

+0

我的不好,php的'm'行为是多行的 – nrathaus

+0

你的问题是'。*'不匹配换行符 – nrathaus

回答

1

好了,所以这个问题是新线不断,但是这正则表达式将得到a元素的文本:

<th.*|\n>.*|\nOrganizer.*|\n*title=".*">(.*)<\/a> 

注意为表达*|\n

这是一个Regex 101来证明它。


由于Niet说,你可以只使用s修改。正则表达式然后是:

<th.*>.*Organizer.*title=".*">(.*)<\/a> 

但你会发送一个额外的修饰符 - s。这是一个Regex 101来证明它。

+0

为什么不使用DOTALL修饰符's'? –

+0

@NiettheDarkAbsol,奇妙的想法 - 非常感谢!你每天学习新的东西! –

+0

[我也会用](http://stackoverflow.com/a/21138662/)'s'修饰符代替。这容易得多。 –

0

默认情况下,点字符与换行符不匹配。如果您还希望.匹配换行符,则需要s修饰符。

PHP manual

如果设定了此修正,在模式中的圆点元字符的所有字符,包括换行符匹配。没有它,换行符被排除在外。

但是,使用正则表达式解析HTML通常是一个坏主意。我建议你改用DOM Parser