【问题标题】:PHP function to replace a HTML tag (e.g. meta description) using preg_replace使用 preg_replace 替换 HTML 标记(例如元描述)的 PHP 函数
【发布时间】:2013-08-30 15:37:17
【问题描述】:

有人可以帮我实现这个功能吗?该函数应该接受$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);

}

【问题讨论】:

  • 改用 DOM 解析器。 Why
  • 另外,看起来你的函数在被替换之前会exit
  • 糟糕!删除了调试代码。我保证那不是问题。 :)

标签: php html regex preg-replace


【解决方案1】:

除非您知道&lt;meta&gt; 将以一致的格式提供(除非您实际上可以控制 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 很大时。如果您可以依赖于&lt;meta&gt; 的一致格式,您希望使用.*? 而不是.* 来捕获内容。 .*? 使搜索不情愿,因此它将停止在 第一个 引用而不是最后一个引用 - 整个 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();

【讨论】:

  • HTML 字符串来自我自己的模板,因此我可以准确预测 格式以匹配我的示例。这会改变你的答案吗?
  • @Canton 不多...将.* 更改为.*? 不能解决问题吗?
【解决方案2】:

建议使用DOMDocument 已经是一个答案,但是如果您在使用正则表达式时遇到困难,那么我可能会帮助您。你可以试试这个:

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

【讨论】:

  • 行得通,谢谢! (顺便说一句,您的示例将 name= 换成了 content=)
  • 是的,对不起,我拼错了一个属性
【解决方案3】:

我知道你问了 preg_replace 并且我迟到了,但是看看这个,你在找它吗......

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

相信我,它比这更快。我认为你应该使用这个功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多