我将不同的网站内容存储在名为$ content的变量中。现在我想做的是搜索META标签的内容,如下所示:
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
然后将utf-8替换为IS0-8859-1。我如何使用preg_replace做到这一点?
请注意每次出现都不像那个元标记。根据您获取的网站,它可能会有所不同。
答案 0 :(得分:0)
您无需使用preg_replace
来执行此操作。只需使用str_replace
:
$content = str_replace('; charset=utf-8', '; charset=ISO-8859-1', $content);
答案 1 :(得分:0)
这样的事情:
$input = 'sometext<meta http-equiv="Content-type" content="text/html; charset=utf-8" />someothertext';
$output = preg_replace('#<meta http-equiv="Content-type" content="text/html; charset=(utf-8)" />#',
'<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />',
$input);
var_dump($output);
其中只是用第二个字符串替换第一个字符串,为您提供:
string 'sometext<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />someothertext' (length=95)
当然,这是考虑输入元总是相同的,总是以相同的方式编写,属性顺序相同而且都是。
正则表达式更宽容可能是:
$output = preg_replace('#<meta\s+http-equiv="Content-type"\s+content="text/html;\s+charset=(utf-8)"\s+/>#',
'<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />',
$input);
当然,这仍然不是真的原谅^^
但是,如果您知道用作输入的元数据总是相同的,那么您不需要正则表达式;我认为str_replace
会做得很好......
这样的事情:
$output = str_replace('<meta http-equiv="Content-type" content="text/html; charset=utf-8" />',
'<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />',
$input);
var_dump($output);
它可以获得相同的输出:
string 'sometext<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />someothertext' (length=95)
在评论和版本OP之后编辑
(是的,我看到另一个答案,基于str_replace,已被接受......但是,这可能会有用)
如果你真的想要操纵那些没有“固定”的HTML,你无法控制,那么根本不使用正则表达式可能会更好,但有些工具就是为此做的。
例如,捆绑的班级DOMDocument
和它的DOMDocument::loadHTML
可能会有所帮助;可能加上一些XPath查询 - 即使它有点像重型炮兵^^
有关更多信息,您可以take a look at this answer几天前我给了另一个问题...
而且,在你的情况下,这样的事情可能会这样做:
$input = <<<HTML
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<p>Hello, world!</p>
</body>
</html>
HTML;
$dom = new DOMDocument();
$dom->loadHTML($input);
$xpath = new DOMXpath($dom);
$metas = $xpath->query('//meta[@http-equiv="Content-type"]');
if ($metas->length > 0) {
$meta = $metas->item(0);
$attribute = $meta->getAttribute('content');
if (strpos($attribute, 'text/html') === 0) {
$meta->setAttribute('content', 'text/html; charset=ISO-8859-1');
}
}
echo $dom->saveHTML();
最有趣的部分是:
生成的HTML将如下所示:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
<title>Test</title>
</head>
<body>
<p>Hello, world!</p>
</body>
</html>
可能有点重,并且需要更多的代码...但是,有了它,它应该始终有效(好吧,只要用作输入的HTML不是太混乱,我猜)。
它适用于文档中的任何其他内容; - )
也许在你的情况下有点太多了,但是,运气好的话,你会记住这一天你必须解析一些HTML,并且最终不会与任何类型的突变正则表达式对抗^^
哦,当然:更改元内容类型不会改变内容的实际编码:如果有必要,您仍然必须自己执行此操作(例如,请参阅iconv或{ {3}})
您可能还需要更改HTTP Content-type标头(如果/何时设置了HTTP标头,则不确定浏览器如何处理元数据)
答案 2 :(得分:0)
你可以匹配'charset = *“'并用”ISO-8859-1“替换*,无论它是什么。
这样的事情:
$content = preg_replace('/(charset=)(.+)\"/', "$1"."ISO-8859-1", $content);