1

我正在尝试使用 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() 的初始字符串,所以我在某种程度上受远程内容的支配。任何帮助将非常感激!

4

3 回答 3

5

使用[\s\S]而不是..

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

.是通配符,但不包括空格 - 包括换行符 - 字符。[\s\S]简单地说“匹配所有空格和非空格字符”。

请注意,我还允许在</td>.

(旁注:HTML 无效 - 在关闭表格单元格之前关闭表格行。)

于 2012-07-05T22:38:31.383 回答
0

没有简单的标志。一个简单的 hack 可能是:

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

然后将 dotall 标志添加到您的正则表达式中,以允许 '.'[dot] 也匹配换行符。但它可以匹配更多。它是您自己的代码还是您从第三方网站翻录 html?因为也许你在不需要的时候使用了正则表达式!

于 2012-07-05T22:38:16.290 回答
0

我认为诀窍是[\s]*在 HTML 形式合法允许空白的任何地方“洒”。您不需要特殊的标志或任何东西。

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

请记住,html 对空格非常宽容。您需要评估您的输入并确定您可以接受的容忍度。

另一个需要注意的是,这些元素可能具有不同的属性或不同的引用样式......如果您也必须使用它,您将需要使用更多的.然后使用“未就绪”标志(u在传递它时添加在模式之后到 preg 函数);然后,一旦您意识到 > 可以合法地出现在属性内部,也许会进行一些花哨的反向引用;-)

于 2012-07-05T23:00:21.723 回答