[英]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.