DOMDocument->loadHTML() 创建与我传入的内容完全不同的内容

DOMDocument->loadHTML() creating entirely different content from what I pass in

我有一个函数,它接受一些变量和 returns 一个 DOMDocument,其中有一大块 html,根据传递的变量设置了特定的值。该功能看起来像这样,我确信有更好的方法可以做到这一点,但我不明白为什么我会遇到我遇到的问题:

static function getEventContent($eventName, $eventNum){
        $dom = new DOMDocument();
        $dom->loadHTML(
        '<div id="event-' . $eventNum  . '" class="tab-pane' . $eventNum == 0 ? ' active' : '' . '">
                <h2>' . isset($eventName) ? $eventName : 'Event' . '</h2>
                <ol class="nav nav-tabs">
                    <li class="nav-item">
                        <a class="nav-link active" href="#about-' . $eventNum . '" data-toggle="tab">About</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#drawsheet-' . $eventNum . '" data-toggle="tab">Drawsheet</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#players-' . $eventNum . '" data-toggle="tab">Players</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#contact-' . $eventNum . '" data-toggle="tab">Contact</a>
                    </li>
                </ol>
                <div class="tab-content">
                    <div id="about-' . $eventNum . '" class="tab-pane active">
                        <h3>About</h3>
                    </div>
                    <div id="drawsheet-' . $eventNum . '" class="tab-pane">
                        <h3>Drawsheet</h3>
                    </div>
                    <div id="players-' . $eventNum . '" class="tab-pane">
                        <h3>Players</h3>
                    </div>
                    <div id="contact-' . $eventNum . '" class="tab-pane">
                        <h3>Contact</h3>
                    </div>
                </div>
                </div>');
        return $dom;
    }

不知何故,当我执行 return $dom 时,DOMDocument 的全部内容已被单个 <p> 标记替换,其文本为 $eventName。同样,我确信有更好的方法来生成我想要的内容(我很乐意接受建议),但这绝对没有意义。我生成的内容中甚至没有 <p>。当我尝试注释掉整个 loadHTML() 块并将其替换为更简单的 loadHTML('<h1>test</h1>') 时,它工作得很好并返回了 header 标记。为清楚起见,这有效:

static function getEventContent($eventName, $eventNum){
        $dom = new DOMDocument();
        $dom->loadHTML('<h1>test</h1>');
        return $dom->saveHTML();
    }

您错误地识别了问题。你没有传递你认为的自己。根据经验,您应该分解代码以测试失败的地方:将传递给方法的字符串存储在变量中,回显它以查看值是否符合您的预期,然后将变量传递给方法.

问题是由字符串中间的三元运算符引起的。

从字符串开头到 ? 的所有内容 都是条件(下图中的黑色)。这是一个真实值,因此您分配的值是 $eventName(绿色),在 : 之后留下 everything 作为未使用的值(红色) .

您需要括号来设置优先级(或将字符串生成分解为更易于管理的块)。

<h2>' . (isset($eventName) ? $eventName : 'Event') . '</h2>