2009-08-16 6 views
0

J'ai différents sites Web contenus contenus dans un variabel nommé $ content. Maintenant, ce que je voudrais faire est de rechercher le contenu des Méta-étiquettes comme ceci:Remplacement de jeu de caractères avec preg_replace

<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 

Et puis remplacer le utf-8 à IS0-8859-1. Comment est-ce que je fais ça avec preg_replace?

Notez que chaque occurrence n'est pas comme cette méta-étiquette. Cela pourrait être différent selon le site web que vous allez chercher.

+0

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. –

+0

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 –

Répondre

0

Vous n'avez pas besoin d'utiliser preg_replace pour ce faire. Il suffit d'utiliser str_replace:

$content = str_replace('; charset=utf-8', '; charset=ISO-8859-1', $content); 
+0

Lire ce que j'ai commenté sur le post de karim79. :) –

+0

Cela ressemble à la solution la plus simple ... Mais que se passera-t-il s'il y a "; charset = utf-8" dans un autre endroit de la page? Par exemple, que se passera-t-il si cette section de code est utilisée sur cette page, qui contient la chaîne "; charset = utf-8" plusieurs fois dans son contenu (dans cette même réponse, par exemple ^^)? –

+0

@Pascal MARTIN - alors une chaîne plus complète peut être utilisée - voir ma réponse;) – karim79

0

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)

+0

Merci pour votre temps, mais vous devriez lire ce que j'ai commenté sur les autres messages. Parce que chaque occurrence n'est pas comme ça ... –

+0

OK sur la lecture des commentaires sur d'autres messages; à ce moment précis, il n'y a qu'une seule autre réponse, et le seul commentaire qu'il a est "Lisez ce que j'ai commenté sur le post de karim79 :)" ^^ Alors ... ok :-D Je suppose que karim79 a supprimé sa réponse ^^; si votre question n'est pas ce que vous avez demandé dans le PO, nous ne pouvons pas deviner de quoi il s'agit ;-) vous devriez éditer l'OP pour poser la question "complète"; il sera beaucoup plus facile de vous aider de cette façon :-) –

+0

J'ai édité mon premier post. Lisez-le maintenant :) –

0

vous pouvez simplement correspondre « charset = *" » et remplacez le *, quel qu'il soit, par "ISO-8859-1".

Quelque chose comme ceci:

$content = preg_replace('/(charset=)(.+)\"/', "$1"."ISO-8859-1", $content); 
Questions connexes