使用PHP匹配特定的URL模式

时间:2013-09-09 22:01:54

标签: php regex html-parsing

我正在尝试读取HTML文件并捕获与特定网址格式匹配的所有锚标记,以便在另一个网页上显示这些链接。模式看起来像这样:

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查询来找到这些东西?

感谢。

4 个答案:

答案 0 :(得分:1)

哦,jeez,我不敢相信这里的每个答案都使用“/”分隔符。如果你的模式中有斜杠,为了便于阅读,请使用其他东西。

这是一个更好的答案(如果你的锚点可能有除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。

答案 1 :(得分:0)

(.*)替换为(.*?) - 使用延迟量化:

preg_match('/<a href="https:\/\/docs.google.com\/file\/d\/(.*?)<\/a>/', $file, $matches);

答案 2 :(得分:0)

戴夫,

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行中的代码不包含结尾&gt;打开它的开头标签,它需要(。?)而不是(。)。添加?告诉它寻找未知数量的任何字符。 (。*)表示我相信的任何一个角色。

答案 3 :(得分:0)

您可以使用以下正则表达式:

/<a.*?href="(https:\/\/docs\.google\.com\/file\/d\/.*?)".*?>(.*?)<\/a>/

这将为您提供hrefinnerHTML

中的网址

细分

<a.*?href="匹配开始a标记和任何字符,直到href="

(https:\/\/docs\.google\.com\/file\/d\/.*?)"匹配(和捕获)直到href结束(即直到"

.*?>将所有字​​符匹配到a代码>的末尾

(.*?)<\/a>匹配(并捕获)innerHTML,直至结束a标记(即</a>)。