我正在尝试读取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查询来找到这些东西?
感谢。
答案 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>/
这将为您提供href
和innerHTML
。
细分
<a.*?href="
匹配开始a
标记和任何字符,直到href="
(https:\/\/docs\.google\.com\/file\/d\/.*?)"
匹配(和捕获)直到href
结束(即直到"
.*?>
将所有字符匹配到a
代码>
的末尾
(.*?)<\/a>
匹配(并捕获)innerHTML
,直至结束a
标记(即</a>
)。