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

时间:2012-07-05 22:29:56

标签: php preg-match multiline

我正在尝试使用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 个答案:

答案 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;这可能是一些奇特的反向引用可以合法地出现在属性内部; - )