好的,就是这样。 Blade 组件或模板中使用的 {{ }} 将始终将标签呈现为 html 实体。所以关键是,正如上面 miken32 所说,只是在返回之前在字符串上使用 strip_tags,然后使用 {!! !!} 将
标签呈现为实际的中断标签,而不是 html 实体。
谢谢 miken 和 speckulatius。
好的,我相信 strip_tags 不是一个好主意。所以这里又是一个问题,也许是一个答案。答案之一就是编辑 Blade 模板,这样您就可以将
标签直接放在模板中,而不用冒险将它放在数据库中。但我认为它仍然可以在后端完成。这是我用来在数据表中呈现一个人的地址的函数。
public function getFullAddressFhAttribute(){
$a1 = (!is_null($this->address_1) && strlen(trim($this->address_1))>3) ? ucWordsSpace(trim($this->address_1),'addr') : '';
$a2 = (!is_null($this->address_2) && strlen(trim($this->address_2))>3) ? ucWordsSpace(trim($this->address_2),'addr') : '';
$a3 = (!is_null($this->address_3) && strlen(trim($this->address_3))>3) ? ucWordsSpace(trim($this->address_3),'addr') : '';
$c = (!is_null($this->city) && strlen(trim($this->city))>2) ? Str::title(trim($this->city)) : '';
$s = (!is_null($this->state) && strlen(trim($this->state))>1) ? trim($this->state) : '';
$s = (strlen($s)==2) ? strtoupper($s) : Str::title($s);
$z = (!is_null($this->zip_code) && strlen(trim($this->zip_code))>4) ? formatzip($this->zip_code) : '' ;
$address = (strlen($a1)>3) ? $a1 : '';
$address .= (strlen($address)>3 && strlen($a2)>3) ? "<br>$a2" : '';
$address .= (strlen($address)>3 && strlen($a3)>3) ? "<br>$a3" : '';
$address = (strlen($address)>3) ? $address . "<br>" : "<i>Street Addr Unknown</i><br>";
if(strlen($c.$s)==0)
$address .= "<i>City,State Unknown</i>";
else{
$address .= (strlen($c)>2) ? "$c," : "?, ";
$address .= (strlen($s)>1) ? " $s" : " ?";
}
$address .= (strlen($z)>4) ? " $z" : '';
$safeElements = ["<br>", "<b>", "<i>"];
return strip_tags($address, $safeElements);
}
我认为如果将上面的函数重写为前7个变量的strip_tags会更安全,如下所示:
public function getFullAddressFhAttribute(){
$a1 = (!is_null($this->address_1) && strlen(trim($this->address_1))>3) ? ucWordsSpace(trim($this->address_1),'addr') : '';
$a2 = (!is_null($this->address_2) && strlen(trim($this->address_2))>3) ? ucWordsSpace(trim($this->address_2),'addr') : '';
$a3 = (!is_null($this->address_3) && strlen(trim($this->address_3))>3) ? ucWordsSpace(trim($this->address_3),'addr') : '';
$c = (!is_null($this->city) && strlen(trim($this->city))>2) ? Str::title(trim($this->city)) : '';
$s = (!is_null($this->state) && strlen(trim($this->state))>1) ? trim($this->state) : '';
$s = (strlen($s)==2) ? strtoupper($s) : Str::title($s);
$z = (!is_null($this->zip_code) && strlen(trim($this->zip_code))>4) ? formatzip($this->zip_code) : '' ;
$a1 = strip_tags($a1);
$a2 = strip_tags($a2);
$a3 = strip_tags($a3);
$c = strip_tags($c);
$s = strip_tags($s);
$z = strip_tags($z);
$address = (strlen($a1)>3) ? $a1 : '';
$address .= (strlen($address)>3 && strlen($a2)>3) ? "<br>$a2" : '';
$address .= (strlen($address)>3 && strlen($a3)>3) ? "<br>$a3" : '';
$address = (strlen($address)>3) ? $address . "<br>" : "<i>Street Addr Unknown</i><br>";
if(strlen($c.$s)==0)
$address .= "<i>City,State Unknown</i>";
else{
$address .= (strlen($c)>2) ? "$c," : "?, ";
$address .= (strlen($s)>1) ? " $s" : " ?";
}
$address .= (strlen($z)>4) ? " $z" : '';
$safeElements = ["<br>", "<b>", "<i>"];
return strip_tags($address, $safeElements);
}
所以在你把安全的标签放在后端之前,把所有的标签都去掉。