繁体   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