1

我有一个类,将 CSS 和 Javascript 文件的路径存储在数组中。此类还编译我的最终页面 HTML 输出(存储在 $output 变量中)。我想遍历我的 $css 和 $js 数组并在 $output 中的特定点注入 HTML。CSS 文件需要在之前进行</head>,而 JS 文件需要在之前进行</body>

在我的 HTML 模板文件中包含占位符 $cssFiles 和 $jsFiles 变量对我来说不是一个选项。

只是为了使这进一步复杂化(对不起),我需要一个故障保护,如果</head>和/或</body>不存在于 $output 中,则代码将在 $output 的开头注入。

我认为这是一个正则表达式问题,但我不知道模式是什么。

谢谢!

4

2 回答 2

4

当一个简单的str_replace()就足够时,我不会使用正则表达式。听起来您已经在$output字符串中确定了要修改的明确位置,所以我会这样做:

$cssStr = '';
$jsStr = '';
foreach($css as $path) {
    $cssStr .= '<link rel="stylesheet" type="text/css" media="screen"'.
     'href="'.$path.'"/>';
}
if (strpos($output,'</head>') !== false)) {
    $output = str_replace('</head>',$cssStr.'</head>',$output);
} else {
    $output = $cssStr . $output;
}

foreach($js as $path) {
    $jsStr .= '<script type="text/javascript" src="'.$path.'"></script>';
}
if (strpos($output,'</body>') !== false)) {
    $output = str_replace('</body>',$jsStr.'</body>',$output);
} else {
    $output = $jsStr . $output;
}
于 2009-09-07T04:15:29.873 回答
1

考虑到您愿意“解析”HTML,这不是一件容易的事,实际上我不确定正则表达式是否适合这项工作。

如果你总是在那里,我建议使用简单的</head>:比正则表达式更简单、更快。</body>str_replace

如果这些并不总是存在...我想这将变得更加困难...

对于“头尾”部分,您可以检查是否在此处strpos例如,使用 );如果没有,请尝试在</title>标记(简单:use str_replace<meta>标记(在第一个 " 之前插入)之后插入代码;这可能不是标题部分的结尾,但总比没有好。

对于“身体的末端”部分,您可以检查是否</body>存在;如果没有,只需将您的代码连接到整个 HTML 字符串。


无论如何,要“解析” HTML,我不会使用正则表达式,而是会使用一些 DOM 操作工具,例如与 PHP 捆绑的 DOMDocument 类及其DOMDocument::loadHTML方法。

于 2009-09-07T04:12:04.577 回答