[英]Matching a Specific URL Pattern with PHP
我正在嘗試讀取HTML文件並捕獲與特定URL模式匹配的所有定位標記,以便在另一頁上顯示這些鏈接。 該模式如下所示:
https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web
我對RegEx不滿意。 我已經嘗試了很多方法並在Stack Overflow上閱讀了一堆答案,但是我沒有找到正確的語法。
這是我現在所擁有的:
preg_match ('/<a href="https:\/\/docs.google.com\/file\/d\/(.*)<\/a>/', $file, $matches)
當我在具有兩個匹配的定位標記的HTML頁面上對此進行測試時,第一個結果包括第一個和第二個匹配項以及兩者之間的所有內容,而第二個結果包括第一個匹配項的一部分,第二個匹配項的一部分以及兩者之間的所有內容。
雖然我很樂意將匹配的錨定標記與內部HTML一起捕獲,但是如果我能夠使用每個匹配的錨定標記的HREF屬性以及匹配的內部HTML生成多維數組,我會更加高興(因此,我可以自己格式化鏈接,而不必使用更多的RegEx擺脫不必要的屬性)。 我會為此使用preg_match_all嗎? 那會是什么樣?
我是否在這里正確的道路上,還是應該使用DOM和XPath查詢來找到這些東西?
謝謝。
哎呀,我不敢相信這里的每個答案都使用“ /”定界符。 如果您的模式中包含斜線,請使用其他名稱以提高可讀性。
這是一個更好的答案(如果您的錨可能具有href以外的其他屬性,則可能需要進行調整):
$hrefPattern = "(?P<href>https://docs\.google\.com/file/d/[a-z0-9]+/edit\?usp=drive_web)";
$innerPattern = "(?P<inner>.*?)";
$anchorPattern = "<a href=\"$hrefPattern\">$innerPattern</a>";
preg_match_all("@$anchorPattern@i", $file, $matches);
這將為您提供以下信息:
[
0 => ['<a href="https://docs.google.com/file/d/foo/edit?usp=drive_web"><span>More foo</span></a>'],
"href" => ["https://docs.google.com/file/d/foo/edit?usp=drive_web"],
"inner" => ["<span>More foo</span>"]
]
當然,您應該為此使用DOM。
用(.*?)
替換(.*)
-使用惰性量化:
preg_match('/<a href="https:\/\/docs.google.com\/file\/d\/(.*?)<\/a>/', $file, $matches);
戴夫
DOM會更好。 但是這是有效的正則表達式。
$url = 'href="https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web"';
preg_match ('/href="https:\/\/docs.google.com\/file\/d\/(.*?)"/', $url, $matches);
結果:
array (size=2)
0 => string 'href="https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web"' (length=82)
1 => string 'aBunchOfLettersAndNumbers/edit?usp=drive_web' (length=44)
您可以使用html標記,但是最重要的是,在您的問題中,preg_match行中的代碼不包含將開始標記扔掉的開始標記的結尾>,並且需要使用(。 ?)而不是(。 )。 。 增加了嗎? 告訴它尋找數量未知的任何字符。 (。*)表示我相信的任何一個字符。
您可以使用以下正則表達式:
/<a.*?href="(https:\/\/docs\.google\.com\/file\/d\/.*?)".*?>(.*?)<\/a>/
這將為您提供來自href
和innerHTML
的URL。
分解
<a.*?href="
匹配開頭a
標簽和所有字符,直到href="
(https:\\/\\/docs\\.google\\.com\\/file\\/d\\/.*?)"
匹配(並捕獲)直到href
結束(即直到"
.*?>
匹配所有字符,以結束a
標簽>
(.*?)<\\/a>
件(和捕獲)的innerHTML
,直到關閉a
標簽(即</a>
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.