提问者:小点点

使用PHP和preg_match从多行模式中提取值


我试图用PHP和preg_match从多行模式中提取一个值。我在传递给preg_match($regex,$string,$The_match)的字符串中搜索的模式:

Latitude:</td>
        <td class="formCell">
        40-45-40.205 N
       </tr>

我知道,如果一切都在一条线上,就像这样:

Latitude:</td><td class="formCell">40-45-40.205 N</tr>

然后以下内容将是有效的,它将正确地提取值:

/Latitude:<\/td><td class="formCell">(.*?)<\/tr>/

然而,由于我正在寻找的模式有多行,上面的正则表达式不起作用。我通过file_get_contents($url)获取传递给preg_match()的初始字符串,因此在某种程度上我受远程内容的支配。任何帮助都将不胜感激!


共3个答案

匿名用户

使用[\s\s]而不是

/Latitude:<\/td>[\s]*<td class="formCell">([\s\S]*?)<\/tr>/

是一个通配符,但不包括空格(包括换行符)字符<代码>[\s\s]只是说“匹配所有空格和非空格字符”。

注意:我还允许在

(附注:超文本标记语言无效-在关闭表单元格之前关闭表行。)

匿名用户

这方面没有简单的标志。一个简单的黑客可以是:

Latitude:(.*?)<\/td>(.*?)<td class="formCell">(.*?)<\/tr>

然后在正则表达式中添加dotall标志,以允许.[点]也匹配换行符。但是它可以匹配更多。这是你自己的代码还是你从第三方网站上撕下的html?因为也许你在不必要的时候使用正则表达式!

匿名用户

我认为诀窍是在HTML格式合法允许空白的任何地方“喷洒”[\s]*。你不需要特别的旗帜或任何东西。

Latitude:[\s]*<\/td>[\s]*<td[\s]*class="formCell">[\s]*([\s\S]*?)[\s]*<\/tr>

请记住,html非常宽容空白。您需要评估您的输入,并决定什么是您可以接受的公差。

另一个警告是,这些元素可能有不同的属性,或不同的引用样式...如果您也必须使用它,您将需要使用更多的。然后使用“未准备好”标志(在将模式传递给preg函数时,在模式后面添加u);然后也许是一些花哨的后退一旦你意识到