使用 DomDocument 更改数千个帖子中的<a>

Altering <a> in thousands of posts with DomDocument

提问人:TheBigK 提问时间:1/12/2023 最后编辑:halferTheBigK 更新时间:2/26/2023 访问量:39

问:

我使用 PHP 类从 3000 多个帖子中提取所有标签,并将它们收集到数据库中,如下所示 -DomDocumenta

我使用函数来填充表格。domDocumentC14N()existing_link

id | existing_link | replacement_link

1 | <a class="class1" href="domain1.com" rel="nofollow">Domain1.com</a> | <a href="domain2.com">Domain2.com</a> 

我最初的想法是简单地使用 Laravel 来查找和替换上表中的链接。但是,做了一些我没有想到的事情。它按字母顺序排列链接的属性。也就是说,虽然我帖子中的链接以 -Str::replace()C14N()

<a href="domain1.com" class="class1" rel="nofollow">Domain1.com</a>

C14N() 函数保存了它,属性顺序发生了变化(class -> href -> rel)!请看上表。existing_link

因此,我无法使用 Laravel 的快速替换链接;即使它们在技术上是相同的链接;它们不是相同的字符串。Str::replace()

我的数据库中的每个帖子都可以根据我准备的表格替换多个链接。到目前为止,我最好的尝试如下——

$new_links = DB::table('links')->get();

        foreach ($new_links as $new_link)
        {

            $post = Post::where('id', $new_link->id)->first();
            $post_body = $post->body;

            $domDocument = new \DOMDocument();
            $domDocument->loadHTML($post_body, LIBXML_NOERROR);

            // Pull the links in the post body
            $old_links = $domDocument->getElementsByTagName('a');

            foreach ($old_links as $old_link)
            {
                if($old_link->C14N() == $new_link->existing_link)
                {
                    // Perform the replacement. I can't figure out how to do this using DOMDOcument.
                }
            }
        }

如何使用 DOMDocument 实现链接的最终替换?我对任何其他方法都持开放态度。

php laravel dom domdocument

评论

0赞 Manuel Eduardo Romero 1/12/2023
我不明白为什么你不能使用str_replace。如果需要更换正文中的链接。'str_replace($old_link->C14N(), $new_link->existing_link, $post->body);
0赞 Manuel Eduardo Romero 1/12/2023
您可以执行 C14N() 的转储,以查看可用的方法。get_class_methods($old_link->C14()) 如果它是一个对象。也许它有一个名为 ->getRel() 或类似方法的方法。
0赞 TheBigK 1/13/2023
@ManuelEduardoRomero -> 因为无法检测到文本中的字符串。在检测到它并对其进行排序之前,它仍然作为链接存在。str_replace()C14N()

答: 暂无答案