我一直致力于解析一个输入,即HTML。但是,我需要能够找到所有没有协议的href或src属性,例如http://,https://或ftp://等,当它们没有用包含协议和域的变量替换它时。
例如,我想要
<a href="/_mylink/goes/here">Link 1</a>
<a href="http://site.com/_myotherlink/goes/here">Link 2</a>返回:
<a href="http://mydomain.com/_mylink/goes/here">Link 1</a>
<a href="http://site.com/_myotherlink/goes/here">Link 2</a>我可以获得整个href属性,但我似乎不知道如何只在缺少协议的情况下进行匹配和替换。我发现^0-9可以以反/非的方式工作,但当我尝试使用http:// etc时,我发现我无法让它工作。
编辑:
我只想提一下,因为它对我来说已经是这个问题的“范围”的一部分,我想避免由于替换而导致的url编码,因为我在其中的一些上使用了{}之类的东西,我不希望它们中有%7B%7D这样的东西。
发布于 2012-02-02 09:12:25
为什么不使用DOM轻松地替换这些属性呢?例如
$domain = 'http://mydomain.com';
$currentPath = '/some/absolute/path/'; // make sure this starts and ends with a forward-slash
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$attrs = $xpath->query('//@href[not(contains(., "://"))]');
foreach ($attrs as $attr) {
$attr->value = sprintf('%s%s%s',
$domain,
$attr->value[0] == '/' ? '' : $currentPath,
htmlspecialchars($attr->value)
);
}
$attrs = $xpath->query('//@src[not(contains(., "://"))]');
foreach ($attrs as $attr) {
$attr->value = sprintf('%s%s%s',
$domain,
$attr->value[0] == '/' ? '' : $currentPath,
htmlspecialchars($attr->value)
);
}
echo $doc->saveHTML();发布于 2012-02-02 09:10:04
从本质上讲,您正在寻找的是“非”-pattern。那将是一个negative assertion
(?!http://)例如,将其添加到/href="(?!http://)[^"]+"/中。
或者,您可以使用preg_replace_callback并对其进行排序。
既然您说过“解析”,那么它就是一种主题;对于HTML遍历,另一种选择是phpquery或querypath。然后,您可以使用以下命令遍历所有链接:
foreach (htmlqp($html)->find("a[href]") as $tag) {
if (!strstr($tag->attr("href"), "http://")) {
$tag->attr("href", "$add....");输出转换显然是过度杀伤力。但是对于任意的HTML来说,这可能是一个更有弹性的选择。
https://stackoverflow.com/questions/9105637
复制相似问题