Qu'en est-il quelque chose comme ceci:
$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);
qui remplace simplement la première chaîne par la seconde, vous donnant:
string 'sometext<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />someothertext' (length=95)
Bien sûr, cela est Considérant que l'entrée meta est toujours la même, toujours écrite de la même façon, avec des attributs dans le même ordre et tout ça.
Un regex un peu plus indulgent peut-être:
$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);
Bien sûr, cela est toujours pas vraiment pardonner ^^
Mais, si vous connaissez le méta utilisé comme entrée sera toujours le même, vous n'avez pas besoin d'une regex; str_replace
fera le travail très bien, je suppose ...
Quelque chose comme ceci:
$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);
Ce qui vous obtient la même sortie:
string 'sometext<meta http-equiv="Content-type" content="text/html; charset=IS0-8859-1" />someothertext' (length=95)
EDIT après les commentaires et l'édition de l'OP
(Ouais, je l'ai vu une autre réponse, basée sur str_replace, a été accepté ... encore, peut-être que ce sera utile)
Si vous voulez vraiment manipuler HTML qui n'est pas « fixe » , sur lequel vous n'avez aucun contrôle, il pourrait être préférable de ne pas utiliser regex, mais un outil fait exactement pour cela. Par exemple, la classe groupée DOMDocument
, et DOMDocument::loadHTML
peut probablement aider; peut-être couplé avec quelques requêtes XPath - même si ça ressemble un peu à de l'artillerie lourde ^^
Pour plus d'informations, vous pouvez take a look at this answer J'ai donné une autre question il y a quelques jours ...
Et, dans votre cas, quelque chose comme cela ferait sans doute:
$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();
Les parties les plus intéressantes sont:
- Vous utilisez un analyseur DOM, avec des méthodes DOM standards
- Vous pouvez faire des requêtes XPath pour localiser exactement l'élément dont vous avez besoin
Le code HTML résultant ressemblera à ceci:
<!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>
Peut-être un peu plus lourd et nécessite plus de code ... Mais, avec cela, il faut toujours travailler (bien, aussi longtemps que le code HTML utilisé comme entrée est pas trop foiré, je suppose).
Et cela fonctionnera pour quoi que ce soit d'autre dans le document ;-)
Peut-être un peu trop dans votre cas, mais, avec un peu de chance, vous vous en souvenez le jour où vous devez analyser certains HTML, et ne finissent par se battre avec/contre toute forme de mutant regex ^^
Oh, et bien sûr: changer la méta-type de contenu ne changera pas le vrai encodage de votre contenu: vous Il faudra encore le faire vous-même, si nécessaire (par exemple, voir iconv ou utf8_decode
)
Vous pourriez aussi avoir besoin de changer l'en-tête Content-Type HTTP (pas sûr de la façon dont les navigateurs traitent de la méta si/quand l'en-tête HTTP est défini)
Désolé, mais je ne comprends toujours pas ce que vous demandez. Si vous voulez juste remplacer UTF-8 par ISO-8859-1, alors ma réponse fonctionnera bien. –
Yepp, je l'ai testé sais et ça marche bien. Mais pourquoi certains personnages de sites Web sont-ils encore étranges? Comme ÅÄÖ est très bizarre. Il est devenu –