我试图用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()的初始字符串,因此在某种程度上我受远程内容的支配。任何帮助都将不胜感激!
使用[\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
);然后也许是一些花哨的后退一旦你意识到