因此,我需要将"inlineAssetLink"类注入到属于段落一部分的锚标记中,但将"blockAssetLink"类注入到位于空段落内的锚标记中.

不确定这是否可以使用x路径,但内容来自cms中的所见即所得编辑器,我想在服务器端而不是使用JavaScript进行此操作.

已经使用DOMASYS来操纵内容的其他部分,因此最好对此做同样的事情.

推荐答案

以下代码将其加载到DOMDocument中,并通过判断每个锚点的父级的子级计数将这些类应用到所有锚点.

function addClassesToAnchors($html)
{
    $dom = new DOMDocument();
    $dom->loadHTML(
        "<div class='my-wrapper'>$html</div>",
        LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
    );

    // get all anchors
    $anchors = $dom->getElementsByTagName('a');

    foreach ($anchors as $anchor) {
        $parentNode = $anchor->parentNode;

        if ($parentNode->nodeName == 'p') {
            $childNodes = $parentNode->childNodes;

            // count children, expect 1 for empty p
            $count = 0;
            foreach ($childNodes as $childNode) {
                $count++;
            }

            if ($count == 1) {
                $anchor->setAttribute('class', 'blockAssetLink');
            }
            if ($count > 1) {
                $anchor->setAttribute('class', 'inlineAssetLink');
            }
        }
    }

    // Get the content as HTML without the <div> wrapper
    $divElement = $dom->documentElement;
    $result = '';
    foreach ($divElement->childNodes as $node) {
        $result .= $dom->saveHTML($node);
    }

    return $result;
}

$html = "<p><a></a></p> <p>but not</p> <p>sometext<a>link</a>or some text</p>";
echo addClassesToAnchors($html);

Php相关问答推荐

用户信息更新期间Laravel邮箱验证问题

WooCommerce在store 页面上显示兼容多语言的产品属性

如何在php中生成包含第100秒的时间序列?

Laravel Nova不使用数组键作为筛选器中的选项值

将文件添加到存档,而不重建存档

如何在Livewire 3 Form类中做依赖注入?

使用php ZipArhive类将Zip压缩文件分成多个部分

CKEDITOR-如何在PHP中判断提交后的空数据

防止同时从Laravel中的用户帐户中提取

根据WooCommerce的定制订单状态增加产品库存

随机显示WordPress快捷代码功能时出现问题

Woocommerce 仅在前端为登录用户提供价格折扣

需要以一种形式执行两个操作

Filament PHP v3:在禁用的表单字段上,ID 不会写入数据库

主机中未检索用户表数据

将自定义保存金额移至 Woocommerce 简单产品中的价格以下

安装 Herd 并返回 Valet 后为 502

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

适当的时区处理 Laravel / Carbon

password_verify 在 PHP 7.4 中有效,但在 PHP 8.2 中无效