簡體   English   中英

使用PHP匹配特定的URL模式

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

這將為您提供來自hrefinnerHTML的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.

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