php 或 JavaScript。需要从 Domdocument 中获取以字符串形式排序的链接 ID,以用于构建自定义分配的链接

问题描述 投票:0回答:1
$version = '1.1';
$sortBy = isset($_GET['sortBy']) ? $_GET['sortBy'] : 'PUBLISHED_DESC';
$articleClassName = 'relative isolate sf-search-ad cursor-pointer overflow-hidden relative transition-all outline-none p-10 hover:bg-aqua-50 focus:bg-aqua-50 sf-search-ad-legendary  -m-8';
$merchantID = '3553552';
$finn_link = 'https://www.finn.no/car/used/search.html?orgId='.$merchantID.'&sort='.$sortBy;
$finnTagName = 'article';
$finnTagLink = 'a';
$finnAttrName = 'class';
$finnAttrValue = $articleClassName;

$finnDom = new DOMDocument;
$finnDom->preserveWhiteSpace = false;
@$finnDom->loadHTMLFile($finn_link);

$finnHtml = getTags( $finnDom, $finnTagName, $finnAttrName, $finnAttrValue );

function getTags( $finnDom, $finnTagName, $finnAttrName, $finnAttrValue ){
    $finnHtml = '';
    $domxpath = new DOMXPath($finnDom);
    $newDom = new DOMDocument;
    $newDom->formatOutput = true;
    $filtered = $domxpath->query("//$finnTagName" . '[@' . $finnAttrName . "='$finnAttrValue']");
    $i = 0;
    while( $myItem = $filtered->item($i++) ){
        $node = $newDom->importNode( $myItem, true );
        $newDom->appendChild($node);
    }
    $finnHtml = $newDom->saveHTML();
    return $finnHtml;
}
?>

我需要将每个包含 ID 链接的文章标签保存在单独的数组中,或者保存到数据库或任何其他方式,以便可以访问它来构建与对象相关的自定义链接(添加)。

这就是使用 DomDocument 排序后的 ny “文章类”的样子:

<article class="relative.....">
    <a href="https://www.finn.no/car/used/ad.html?finnkode=346236078" id="346236078">Link to add</a>
</article>

我需要能够收集

ID
并更改最终锚标记中的链接,以便我可以使用它来呈现另一个
DomDocument
当我的链接被单击时,这不应重定向到其他网站,而应保留在我的网站上。

我正在考虑 foreach 循环,但真的不知道如何在 DOM 中实现它。

任何人都有提示或什么我该怎么做。也许某种类型的比较,例如搜索

<a id="3003030"> 

并转换为

$idLink1='3003030' 

对于每个实例。但我不知道是否能够为每篇文章提供完整的正确链接ID...

php arrays string extract domdocument
1个回答
0
投票

问题不完全清楚。我不知道您是否想在服务器端(在将其发送到浏览器之前)或客户端(当浏览器已经收到它时)编辑 HTML 文档。还不清楚您是要编辑原始页面还是要创建仅包含修改后的标签的新页面。

这是服务器端的一个可能的解决方案,我改编了你的代码。输出是应用了更改的原始文档,如果您只需要更改的标签,您可以删除指示的注释。

我提供了 $conversionIds 数组,其中包含要更改的数据修改。

$conversionIds = [
    
    '0001' => 'xyzk',
    '1234' => '0000',
    '346236078' => 'abcde',
];

.....
$finnDom->loadHTMLFile($finn_link, LIBXML_NOERROR);

// de-comment to create a new DOM document
/*$finnHtml =*/ parseDom ($finnDom, $finnTagName, $finnAttrName, $finnAttrValue, $conversionIds);

// replace with the commented version to create a new DOM document
$newHtml = $finnDom->saveHTML();  // $newHtml = $finnHtml->saveHTML();


function parseDom (&$finnDom, $finnTagName, $finnAttrName, $finnAttrValue, &$conversionIds)
{
// de-comment to create a new DOM document
//    $newDom = new DOMDocument;
//    $newDom->formatOutput = true;

    $domXpath = new DOMXPath($finnDom);
    $q = "//$finnTagName" . '[@' . $finnAttrName . "='$finnAttrValue']";
    $filtered = $domXpath->query($q);

    foreach ($filtered ?: [] as $myItem) {

        foreach ($myItem->getElementsByTagName('a') as $childNode) {  // <~~~ get all <a> sub-elements

            $id = $childNode->getAttribute('id');

            if ($conversionIds[$id] ?? false) {

                $href = $childNode->getAttribute('href');

                $components = parse_url($href);
                $queryStrArr = [];
                parse_str($components['query'] ?? '', $queryStrArr);

                if (isset($queryStrArr['finnkode'])) {

                    $queryStrArr['finnkode'] = $conversionIds[$id];  // <~~~ replace finnkode in the query string of href
                    $queryStr = http_build_query($queryStrArr);

                    $newHref = ($components['scheme'] ?: 'https') .
                               ($components['host'] ?? 'default.host.name') .
                               ($components['path'] ?? 'default.path') .
                               '?' . $queryStr;

                    $childNode->setAttribute('href', $newHref);
                }

                $childNode->setAttribute('id', $conversionIds[$id]); // <~~~ replace id attribute

//          de-comment to create a new DOM document
//                $node = $newDom->importNode ($myItem, true);
//                $newDom->appendChild($node);
            }
        }
    }

    // de-comment to create a new DOM document
    // return $newDom;
}
© www.soinside.com 2019 - 2024. All rights reserved.