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>
我有一个函数,它接受一些变量和 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>