PHP函数使用preg_replace替换HTML标记(例如元描述)

时间:2013-08-30 15:37:17

标签: php html regex preg-replace

有人可以帮助我使用此功能吗?该函数应该接受$HTMLstr - 一整页HTML填充到一个字符串中,该字符串已经包含以下形式的元描述:

<meta name="description" content="This will be replaced"/>

以及$content这是应该替换“将被替换”的字符串。我以为我接近这个功能,但它不太有用。

function HTML_set_meta_description ($HTMLstr, $content) {
$newHTML = preg_replace('/<meta name="description"(.*)"\/>/is', "<meta name=\"description\" content=\"$content\"/>", $HTMLstr);
return ($newHTML);
}

感谢您的帮助!

编辑:这是工作功能。

function HTML_set_meta_description ($HTMLstr, $content) {
// assumes meta format is exactly <meta name="description" content="This will be replaced"/>
$newHTML = preg_replace('/<meta name="description" content="(.*)"\/>/i','<meta name="description" content="' . $content . '" />', $HTMLstr);
return ($newHTML);

}

3 个答案:

答案 0 :(得分:0)

除非您知道<meta>将以一致的格式提供(除非您实际控制HTML,否则很难知道),您将很难构建正则表达式。举几个例子:

<meta content="content" name="description">
<meta content = 'content' name = 'description' />
<meta name= 'description' content ="content"/>

这些都是有效的,但处理它们的正则表达式会非常复杂。类似的东西:

@<meta\s+name\s*=\s*('|")description\1\s+content\s*('|")(.*?)\2\s+/?>@

...而且这甚至没有考虑属于不同顺序的属性。可能还有其他一些我没想过的东西。

另一方面,使用诸如DOMDocument之类的解析器可能非常昂贵,尤其是在HTML很大的情况下。如果您可以依赖于<meta>的一致格式,而您希望使用.*?代替.*来捕获内容。 .*?使搜索不情愿,因此它将停在第一个引号而不是最后一个引号 - 整个HTML文档中可能还有许多其他引号。

$dom = new DOMDocument;
$dom->loadHTML($HTMLstr);
foreach ($dom->getElementsByTagName("meta") as $tag) {
    if (stripos($tag->getAttribute("name"), "description") !== false) {
        $tag->setAttribute("content", $content);
    }
}
return $dom->saveHTML();

答案 1 :(得分:0)

建议使用DOMDocument作为答案,但如果您正在努力使用正则表达式,那么我可能会帮助您。您可以尝试这样做:

return preg_replace('/<meta name="description" content="(.*)"\/>/i','<meta name="description" content="Something replaced" />', $HTMLstr);

答案 2 :(得分:0)

我知道你问preg_replace我迟到了但是看看这个,是不是你要找...

<?php
function meta_desc( $content = null ){
    $desc = 'This will be replaced ';
    if( $content ){
        $desc = $content;
    }
    return '<meta name="description"
content=" '. $desc .' "/>';
}
?>

相信我的速度要快于此。我认为你应该使用这个功能。