我正在尝试使用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()所以我在某种程度上受到了远程内容的支配。任何帮助将不胜感激!
答案 0 :(得分:4)
使用[\s\S]
代替.
。
/Latitude:<\/td>[\s]*<td class="formCell">([\s\S]*?)<\/tr>/
.
是一个通配符,但不包括空格 - 包括换行符 - 字符。 [\s\S]
只是说“匹配所有空格和非空格字符”。
注意我还允许</td>
之后的可选空格字符。
(旁注:HTML无效 - 在关闭表格单元格之前关闭表格行。)
答案 1 :(得分:0)
没有简单的标志。一个简单的黑客可能是:
Latitude:(.*?)<\/td>(.*?)<td class="formCell">(.*?)<\/tr>
然后将dotall标志添加到正则表达式中以允许'。'[dot]也匹配换行符。 但它可以匹配更多。它是你自己的代码还是你从第三方网站上翻录html?因为当你不需要时,你可能正在使用正则表达式。
答案 2 :(得分:0)
我认为诀窍是“洒”[\s]*
HTML正式合法允许空格的任何地方。你不需要特殊标志或任何东西。
Latitude:[\s]*<\/td>[\s]*<td[\s]*class="formCell">[\s]*([\s\S]*?)[\s]*<\/tr>
请记住,html对空白非常宽容。您需要评估您的输入并确定适合您的容忍度。
另一个警告是,这些元素可能具有不同的属性或不同的引用样式......如果您也必须使用它,则需要使用更多.
然后使用“未完成”标志(在将模式传递给preg函数时,在模式之后添加u
);然后,一旦你意识到&gt;这可能是一些奇特的反向引用可以合法地出现在属性内部; - )