有人可以帮助我使用此功能吗?该函数应该接受$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);
}
答案 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 .' "/>';
}
?>
相信我的速度要快于此。我认为你应该使用这个功能。