Как насчет такого:
$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 - даже если это похоже на тяжелую артиллерию ^^
Для получения дополнительной информации вы можете взглянуть на этот ответ, который я дал на другой вопрос несколько дней назад...
И в вашем случае, вероятно, будет что-то вроде этого:
$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();
Наиболее интересные части:
- Вы используете парсер DOM со стандартными методами DOM
- Вы можете выполнять запросы XPath, чтобы найти именно тот элемент, который вам нужен.
Результирующий 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, и вам не придется бороться с/против какого-либо мутантного регулярного выражения ^^
Да, и, конечно же: изменение мета-типа контента не изменит реальную кодировку вашего контента: вам все равно придется делать это самостоятельно, если это необходимо (например, см. icv или utf8_decode
)
Вам также может потребоваться изменить заголовок HTTP Content-type (не знаю, как браузеры обрабатывают метаданные, если/когда установлен заголовок HTTP)
person
Pascal MARTIN
schedule
16.08.2009