Html 标签作为分隔符 PHP 内爆

Html tags as separator with PHP implode

我正在尝试关闭和打开结果之间的新标签,使用标签作为内爆中的分隔符。

代码如下:

$return = array();
if ($result && is_array($result) && sizeof($result)) {
    foreach ($result as $row) {
        $return[$row['id_feature']]['values'][] = $row['value'];
        $return[$row['id_feature']]['name'] = $row['name'];
    }
    $tag = '</a><a>';
    foreach ($return as $key=>$row) $return[$key]['value'] = implode($tag, $row['values']);
}

这是我的结果:

<td><a>Moderna</a><a>Classica</a></td>

看起来不错(在代码上),问题是在浏览器上的真实结果。

它看起来像这样(尝试使用 Chrome、Safari 和 Firefox):

Moderna</a><a>Classica

我想 post 截图,但我不能,因为我是 Whosebug 的菜鸟...

什么都试过了,还没找到原因。

怎么了?是功能还是我认为我可以使用 html 作为内爆的分隔符是错误的?


我会 post 完整代码,如您所愿:

public function getFrontFeatures($id_product, $separator = null, $id_feature = null) {
    if (version_compare(_PS_VERSION_, '1.5.0.0', '>=')) {
        $id_lang = (int)Context::getContext()->cookie->id_lang;
    } else {
        global $cookie;
        $id_lang = $cookie->id_lang;
    }
    if ($separator == null) {
        $config = $this->_getModuleConfiguration();
        $separator = $config['featureSeparator'];
    }
    $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
    SELECT fp.id_feature, vl.value, fl.name
    FROM `'._DB_PREFIX_.'feature_product` fp
    LEFT JOIN `'._DB_PREFIX_.'feature_value` v ON (fp.`id_feature_value` = v.`id_feature_value`)
    LEFT JOIN `'._DB_PREFIX_.'feature_value_lang` vl ON (v.`id_feature_value` = vl.`id_feature_value` AND vl.`id_lang` = '.(int)$id_lang.')
    LEFT JOIN `'._DB_PREFIX_.'feature` f ON (f.`id_feature` = v.`id_feature`)
    '.(version_compare(_PS_VERSION_, '1.5.0.0', '>=') && Shop::isFeatureActive() && Shop::getContext() == Shop::CONTEXT_SHOP ? Shop::addSqlAssociation('feature', 'f') : '').'
    LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON (fl.`id_feature` = f.`id_feature` AND fl.`id_lang` = '.(int)$id_lang.')
    WHERE fp.`id_product` = '.(int)$id_product
    . ($id_feature != null && $id_feature ? ' AND f.`id_feature` = '.(int)$id_feature : '')
    . ' ORDER BY ' 
    . (version_compare(_PS_VERSION_, '1.5.0.0', '>=') ? 'f.`position` ASC, ' : '')
    . 'fp.`position` ASC');
    $return = array();
    if ($result && is_array($result) && sizeof($result)) {
        foreach ($result as $row) {
            $return[$row['id_feature']]['values'][] = $row['value'];
            $return[$row['id_feature']]['name'] = $row['name'];
        }
        $tag = '</a><a>';
        foreach ($return as $key=>$row) $return[$key]['value'] = implode($tag, $row['values']);
    }
    if ($id_feature != null && $id_feature && isset($return[$id_feature])) {
        return $return[$id_feature]['value'];
    } else {
        return $return;
    }
}

这是 .tpl 上的代码:

{if isset($features) && $features}
        <!-- Data sheet -->
        <section class="page-product-box visible-xs">
            <h3 class="page-product-heading">{l s='Data sheet'}</h3>
            <table class="table-data-sheet">
                {foreach from=$features item=feature}
                <tr class="{cycle values="odd,even"}">
                    {if isset($feature.value)}
                    <td>{$feature.name|escape:'html':'UTF-8'}</td>
                    <td><a>{$feature.value|escape:'html':'UTF-8'}</a></td>
                    {/if}
                </tr>
                {/foreach}
            </table>
        </section>
        <!--end Data sheet -->
    {/if}

而且...现在我不再是菜鸟了:D 我可以post 截图:

结果:

检查员:

希望这对您有所帮助...

implode 只需在数组中的每个元素之间添加 "</a><a>"(因此,您无需在前后添加任何内容) 如果你在前面放一个 <a> 并在后面放一个 </a> 就可以了。

return[$key]['value'] = "<a>".implode($tag, $row['values'])."</a>"

在您的模板中,您正在使用转义。

<td><a>{$feature.value|escape:'html':'UTF-8'}</a></td>

但是您要转义的字符串包含 HTML。所以你的字符串

Moderna</a><a>Classica

将转换为

Moderna&lt;/a&gt;&lt;a&gt;Classica

这就是标签在浏览器中显示为文本而不是呈现为 HTML 的原因。 (您可以在 Inspector 包含的图像中看到 </a><a> 是黑色文本,而不是外部标签的颜色。)

很好,你正在转义你的输出。但是由于您从函数返回的内容将包含 HTML,因此您必须在函数中而不是在模板中进行转义。

$return[$row['id_feature']]['values'][] = htmlspecialchars($row['value']);

那你应该可以不用转义就可以使用模板中的值了

<td><a>{$feature.value}</a></td>

这将变得很明显,但我想我应该补充一点,当你准备好将 href 添加到你的 <a> 标签时,使用 implode 加入值,如这将不再有效(除非 link 将始终相同。)