如果字符串包含特定值

时间:2018-01-15 14:23:47

标签: php magento2 preg-match-all

我正在使用preg_match_all来抓取所有脚本并将其放在身体末端,如下所示:

preg_match_all('#(<script.*?</script>)#is', $html, $matches);
$js = '';
foreach ($matches[0] as $value):
    $js .= $value;
endforeach;
$html = preg_replace('#(<script.*?</script>)#is', '', $html);
$html = preg_replace('#</body>#',$js.'</body>',$html);

这已经破坏了页面上的一些功能,但是对于下面的几个脚本:

<script data-template="bundle-summary" type="text/x-magento-template">
      <li>
            <strong class="label"><%- data._label_ %>:</strong>
            <div data-container="options"></div>
      </li>
</script>

如何使用preg_match_all排除<script data-template脚本被移动。

我想我可以通过执行以下操作来检查脚本x-magento-template脚本:

if (strpos($value, 'type="text/x-magento-template"') === false) {
    $js .= $value;
}

然后它不会被添加到$js变量但是我不确定如何在下面的行中停止删除相同的脚本:

$html = preg_replace('#(<script.*?</script>)#is', '', $html);

我需要替换所有脚本,但如果它们包含type="text/x-magento-template

则不需要

更新

我做了以下操作,但我想知道是否有更有效的方法使用preg_match_all执行此操作?

            preg_match_all('#(<script.*?</script>)#is', $html, $matches);
            $js = '';
            foreach ($matches[0] as $value):
                if (strpos($value, 'type="text/x-magento-template"') === false) {
                    $js .= $value;
                    $html = str_replace($value, '', $html);
                }
            endforeach;
            //$html = preg_replace('#(<script.*?</script>)#is', '', $html);
            $html = preg_replace('#</body>#',$js.'</body>',$html);

在确定方法与if语句之间的差异之后,差异可以忽略不计,时间大约为0.005秒,所以很高兴离开它。

1 个答案:

答案 0 :(得分:1)

对于html编辑,DOM方法可以提供更好的结果:

$dom = new DOMDocument;
$state = libxml_use_internal_errors(true);
$dom->loadHTML($html); // or $dom->loadHTMLFile('./file.html'); 

$removeList=[];
$bodyNode = $dom->getElementsByTagName('body')->item(0);

foreach ($dom->getElementsByTagName('script') as $scriptNode) {
    if ( $scriptNode->hasAttribute('type') && $scriptNode->getAttribute('type')=='text/x-magento-template' )
        continue;

    $removeList[] = $scriptNode;
}

foreach ($removeList as $scriptNode) {
    $bodyNode->appendChild($scriptNode);
}

libxml_use_internal_errors($state);

echo $dom->saveHTML();

使用此代码,您不必删除脚本节点,因为它们从dom树中的当前位置移动到body元素的末尾(因为它们被追加)。