web-dev-qa-db-fra.com

Étendre PHP regex pour couvrir les attributs "srcset" et "style"

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 ?

1

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 );
0