2017-01-06 2 views
0

L'exigence est d'ajouter une classe englishText autour de tous les mots anglais sur une page. Le problème est similaire à this, mais les solutions Javascript ne fonctionneront pas pour moi. J'ai besoin d'un exemple PHP pour résoudre ce problème. Par exemple, si vous avez ceci:Ajouter une classe à tout le texte anglais en HTML?

<p>Hello, 你好</p> 
<div>It is me, 你好</div> 
<strong>你好, how are you</strong> 

Ensuite je dois terminer par:

<p><span class="englishText">Hello</span>, 你好</p> 
<div><span class="englishText">It is me</span>, 你好</div> 
<strong>你好, <span class="englishText">how are you</span></strong> 

Il y a plus de cas compliqués, tels que:

<strong>你好, TEXT?</strong> 
<div>It is me, 你好</div> 

Cela devrait devenir:

<strong>你好, <span class="englishText">TEXT?</span></strong> 
<div><span class="englishText">It is me</span>, 你好</div> 

Mais je pense que c un tri sur ces cas de bord une fois que je sais comment effectivement itérer sur le document correctement.

Je ne peux pas utiliser javascript pour résoudre ce parce que:

  1. Cela doit travailler sur les navigateurs qui ne prennent pas en charge javascript
  2. Je préférerais avoir les cours en place sur la charge de la page de sorte qu'il n'est pas un retard dans le rendu du texte dans la police correcte.

J'ai pensé que la meilleure façon d'itérer sur le document serait d'utiliser PHP Simple HTML DOM Parser.

Mais le problème est que si j'essaie ceci:

foreach ($html->find('div') as $element) 
{ 
    // make changes here 
} 

Ma préoccupation est que le cas suivant provoquera le chaos:

<div> 
     Hello , 你好 
     <div>Hello, 你好</div> 
</div> 

Comme vous pouvez le voir, il va aller dans la premier div puis si je traite ce noeud, je vais traiter le noeud dans celui aussi.

Des idées pour contourner cela et sélectionner uniquement les nœuds pour le traitement une fois?

MISE À JOUR

Je me rends compte maintenant que ce que je dois effectivement est une façon récursive à itérer sur les éléments HTML avec la possibilité de les changer comme j'itérer sur eux.

+0

Ainsi, le texte non-anglais seront tous unicode? –

+0

* "' C'est moi, 你好 '" * - ouais, si c'est supposé être "anglais" aussi, c'est une déclaration de problème très vague. Cependant, en général, vous voudrez probablement simplement parcourir tous les nœuds de texte, renvoyer les caractères ASCII et remplacer le nœud de texte par un nouvel ensemble de nœuds en conséquence. – deceze

Répondre

0

Vous devez voyager à travers siblings cette façon, vous ne serez pas en difficulté avec de tels cas ...

Quelque chose comme ça:

<?php 

foreach ($html->find('div') as $element) 
{ 
    foreach($element->next_sibling() as $sibling){ 
     echo $sibling->plaintext()."\n"; 
    } 
} 

?> 

Ou beaucoup plus de facilité imo:

Juste...

  1. chaque changement <*>-"\n"."<*>" avec preg_replace();
  2. Faire un tableau de lignes comme $lines = explode("\n",$html_string);

3.

foreach($lines as $line){ 
     $text = strip_tags($line); 
     echo $text;  
    }