web-dev-qa-db-fra.com

Comment puis-je filtrer les déchets Microsoft Word du contenu collé?

Certains utilisateurs publient sur un blog de groupe et peuvent copier-coller, mais leurs pâtes incluent des éléments tels que:

<!– /* Font Definitions */ @font-face {font-family:”Cambria Math”; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-520092929 1073786111 9 0 415 0;} @font-face {font-family:”Trebuchet MS”; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:”"; margin-top:0in; margin-right:0in; margin-bottom:10.0pt; margin-left:0in; line-height:115%; mso-pagination:Widow-Orphan; font-size:12.0pt; font-family:”Trebuchet MS”,”sans-serif”; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-bidi-font-family:”Times New Roman”; mso-bidi-theme-font:minor-bidi; color:black;} p {mso-style-noshow:yes; mso-style-priority:99; mso-margin-top-alt:auto; margin-right:0in; mso-margin-bottom-alt:auto; margin-left:0in; mso-pagination:Widow-Orphan; font-size:12.0pt; font-family:”Times New Roman”,”serif”; mso-fareast-font-family:”Times New Roman”;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:12.0pt; mso-ansi-font-size:12.0pt; mso-bidi-font-size:12.0pt; mso-ascii-font-family:”Trebuchet MS”; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:”Trebuchet MS”; mso-bidi-font-family:”Times New Roman”; mso-bidi-theme-font:minor-bidi; color:black;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt; line-height:115%;} @page WordSection1 {size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.WordSection1 {page:WordSection1;} –>

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:”Table Normal”;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:”";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0in;
line-height:115%;
mso-pagination:Widow-Orphan;
font-size:11.0pt;
font-family:”Calibri”,”sans-serif”;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:”Times New Roman”;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:”Times New Roman”;
mso-bidi-theme-font:minor-bidi;}

Que puis-je faire pour filtrer automatiquement ce code?

3
artlung

Il existe un bouton dans l'éditeur de texte visuel intégré à WordPress qui supprime le formatage de Microsoft Word. Il est étiqueté "Coller de Word" alt text

8
Chris_O

Je suggérerais d'utiliser TinyMCE Advanced plugin de Ozh. Il vous permet d'ajouter une option "Coller à partir de Word" qui s'occupe de tout cela pour vous.

Cependant, si cela ne vous intéresse pas, vous avez encore quelques options. Comme ça:

function get_rid_of_mso_junk( $content ){
  return preg_replace( '@(mso|panose)[^:]{1,25}:[^;]+;(\s+)?(\n+)?@i', '', $content );
}

add_filter( 'content_save_pre', 'get_rid_of_mso_junk' );

Continuez simplement à ajouter des déclarations indésirables au premier ensemble de capture de cette expression rationnelle pour ajouter des lignes à supprimer. Exemple: (mso|panose|other-junk|annoyance).

5
John P Bloch

Pour ceux qui recherchent une solution à ce problème, j'ai fait quelque chose comme ceci:

function delete_between($beginning, $end, $string) {
    $beginningPos = strpos($string, $beginning);
    $endPos = strpos($string, $end);
    if (!$beginningPos || !$endPos) {
    return $string;
    }

    $textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos);

    return str_replace($textToDelete, '', $string);
}

function clean_content( $content ){
    if( is_home() || is_single()){
        $content = delete_between('<!--[if gte mso', ';}', $content);   
        return $content;
    }else{
    return $content;
}

add_filter( 'the_content', 'clean_content' );
add_filter( 'the_excerpt', 'clean_content' );

Vous pouvez remplacer les chaînes de la fonction delete_between par ce que vous voulez. Cela a semblé fonctionner pour moi cependant.

2
codeprokanner

J'ai travaillé avec des clients confrontés à ce problème. Le truc, j'ai trouvé, est de copier-coller dans la vue HTML, puis de revenir à l'éditeur visuel en format Tweak si nécessaire.

Cela est également nécessaire si vous effectuez un copier-coller depuis un autre site Web. Parfois, vous extrairez accidentellement des définitions de classe et un style en ligne à partir de la source externe, ce qui peut altérer l'affichage si ces mêmes classes ou styles ne sont ni configurés ni pris en charge par votre site.

Une autre option serait d'exposer vos utilisateurs à Windows Live Writer . C'est un produit Microsoft totalement gratuit, qui fonctionne bien avec le copier-coller à partir de Word et qui peut interagir avec WordPress - vous écrivez votre message, modifiez-le, utilisez le correcteur orthographique intégré, formatez-le de manière à ce qu'il afficheexactementComment vous voulez, puis cliquez sur "Publier" pour envoyer votre message à WordPress via XMLRPC. C'est un système assez solide qui rendincroyablementfacile à apprendre à un blogueur débutant à bloguer ... surtout parce que l'interface utilisateur est si similaire à Word.

2
EAMann