J'ai créé un plugin qui transforme tous les liens en URL relatives au protocole (en supprimant http:
et https:
) en fonction des balises et des attributs que je répertorie dans le $tag
et $attribute
variables. Cela fait partie de la fonction. Pour économiser de l'espace, le reste du code peut être trouvé ici .
$tag = 'a|base|div|form|iframe|img|link|meta|script|svg';
$attribute = 'action|content|data-project-file|href|src|srcset|style';
# If 'Protocol Relative URL' option is checked, only apply change to internal links
if ( $this->option == 1 ) {
# Remove protocol from home URL
$website = preg_replace( '/https?:\/\//', '', home_url() );
# Remove protocol from internal links
$links = preg_replace( '/(<(' . $tag . ')([^>]*)(' . $attribute . ')=["\'])https?:\/\/' . $website . '/i', '$1//' . $website, $links );
}
# Else, remove protocols from all links
else {
$links = preg_replace( '/(<(' . $tag . ')([^>]*)(' . $attribute . ')=["\'])https?:\/\//i', '$1//', $links );
}
Cela fonctionne comme prévu, mais cela ne fonctionne pas sur les exemples suivants:
<!-- Within the 'style' attribute -->
<div class="some-class" style='background-color:rgba(255,255,255,0);background-image:url("http://placehold.it/300x200");background-position:center center;background-repeat:no-repeat'>
<!-- Within the 'srcset' attribute -->
<img src="http://placehold.it/600x300" srcset="http://placehold.it/500 500x, http://placehold.it/100 100w">
Toutefois, le code fonctionne partiellement pour ces exemples.
<div class="some-class" style='background-color:rgba(255,255,255,0);background-image:url("http://placehold.it/300x200");background-position:center center;background-repeat:no-repeat'>
<img src="http://placehold.it/600x300" srcset="//placehold.it/500 500x, http://placehold.it/100 100w">
J'ai joué avec l'ajout de valeurs supplémentaires aux variables $tag
et $attribute
, mais cela n'a pas aidé. Je suppose que je dois mettre à jour le reste de mon regex pour couvrir ces deux balises supplémentaires? Ou existe-t-il une autre façon de l'aborder, telle que DOMDocument ?
J'ai pu utiliser la regex suivante pour couvrir tous les tags et attributs avec des protocoles:
/<(?:input\b[^<]*\bvalue=[\"\']https?:\/\/|link\b[^<]*?\brel=[\'\"]canonical[\'\"][^<]*?>)(*SKIP)(*F)|https?:\/\//
Ceci est la section mise à jour:
# If 'Relative' option is selected, remove domain from all internal links
$exceptions = '<(?:input\b[^<]*\bvalue=[\"\']https?:\/\/|link\b[^<]*?\brel=[\'\"]canonical[\'\"][^<]*?>)(*SKIP)(*F)';
if ( $this->option == 2 ) {
$website = preg_replace( '/https?:\/\//', '', home_url() );
$links = preg_replace( '/' . $exceptions . '|https?:\/\/' . $website . '/', '', $links );
}
# For all external links, remove protocols
$links = preg_replace( '/<(?:input\b[^<]*\bvalue=[\"\']https?:\/\/|link\b[^<]*?\brel=[\'\"]canonical[\'\"][^<]*?>)(*SKIP)(*F)|https?:\/\//', '//', $links );