簡體   English   中英

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

[英]Extract value from a multiline pattern using PHP and 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()所以我在某種程度上受到了遠程內容的支配。 任何幫助將非常感激!

使用[\\s\\S]代替.

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

. 是一個通配符,但不包括空格 - 包括換行符 - 字符。 [\\s\\S]只是說“匹配所有空格和非空格字符”。

注意我還允許在</td>之后選擇空格字符。

(旁注:HTML無效 - 在關閉表格單元格之前關閉表格行。)

這沒有簡單的標志。 一個簡單的黑客可能是:

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

然后將dotall標志添加到正則表達式中以允許'。'[dot]也匹配換行符。 但它可以匹配更多。 它是你自己的代碼還是你從第三方網站上翻錄html? 因為也許你正在使用正則表達式,當你不需要!

我認為訣竅是“撒上” [\\s]* HTML正式合法允許空格的任何地方。 你不需要特殊標志或任何東西。

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

請記住,HTML對空白非常寬容。 您需要評估您的輸入並確定適合您的容差。

另一個需要注意的是,這些元素可能具有不同的屬性或不同的引用樣式......如果您也必須使用它們,則需要使用更多. 然后使用“unready”標志(在將模式傳遞給preg函數時在模式后添加u ); 一旦你意識到>可以合法地出現在一個屬性中,也許還有一些奇特的反向引用;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM