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