0

我正在尝试读取 HTML 文件并捕获与特定 URL 模式匹配的所有锚标记,以便在另一个页面上显示这些链接。该模式如下所示:

https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web

我对正则表达式很糟糕。我已经尝试了很多东西,并在 Stack Overflow 上阅读了很多答案,但我没有找到正确的语法。

这是我现在拥有的:

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

当我在具有两个匹配锚标记的 HTML 页面上对此进行测试时,第一个结果包括第一个和第二个匹配以及介于两者之间的所有内容,而第二个结果包括第一个匹配的一部分、第二个匹配的一部分以及介于两者之间的所有内容。

虽然我很乐意捕获匹配的锚标记以及内部 HTML,但如果我可以生成一个多维数组,其中包含每个匹配的锚标记的 HREF 属性以及匹配的内部 HTML(这样我可以自己格式化链接,而不必使用更多的正则表达式来删除不需要的属性)。我会为此使用 preg_match_all 吗?那会是什么样子?

我是不是走在正确的道路上,还是应该使用 DOM 和 XPath 查询来查找这些东西?

谢谢。

4

4 回答 4

1

哦,天哪,我不敢相信这里的每个答案都使用“/”分隔符。如果您的模式中有斜线,请使用其他内容以提高可读性。

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

于 2013-09-10T03:39:39.517 回答
0

替换(.*)(.*?)- 使用惰性量化:

preg_match('/<a href="https:\/\/docs.google.com\/file\/d\/(.*?)<\/a>/', $file, $matches);
于 2013-09-09T22:10:30.450 回答
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 行中的代码不包含将其丢弃的开始标签的结尾 > 并且它需要具有 (. ?) 而不是 (. ) . 添加的 ? 告诉它寻找任何未知数量的字符。(.*) 表示我相信的任何一个字符。

于 2013-09-09T22:13:10.597 回答
0

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

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

href这将为您提供来自和 的URL innerHTML

分解

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

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

.*?>将所有字符匹配到a标签的末尾>

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

于 2013-09-09T22:15:22.733 回答