web-dev-qa-db-fra.com

Expression rationnelle correcte pour wp_embed_register_handler

LE BUT

J'essaie d'analyser une URL et de la convertir en un lecteur embedded video dans le contenu de mon message, mais je pense que mon regEx est désactivé ou que je ne crée pas un fournisseur correctement.

LE CODE

Voici ce que j'ai configuré maintenant.

wp_embed_register_handler('brightcove', '/(players.brightcove.net/)([^/]+)/([^/]+)/index\.html\?videoId=([\d]+)/g', 'wp_embed_handler_brightcove');

function wp_embed_handler_brightcove($matches, $attr, $url, $rawattr) {

    // var_dump($matches, $attr, $url, $rawattr);

    $account  = esc_attr($matches[ 1 ]);
    $player   = esc_attr($matches[ 2 ]);
    $video_id = esc_attr($matches[ 3 ]);

    $embed = '<div style="display: block; position: relative; max-width: 142.86%;"><div style="padding-top: 39.3742%;"><iframe src="'
    . sprintf('http://players.brightcove.net/%1$s/%2$s/index.html?videoId=%3$s',
              $account,
              $player,
              $video_id
    ) . '" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen="" style="width: 100%; height: 100%; position: absolute; top: 0px; bottom: 0px; right: 0px; left: 0px;"></iframe></div></div>';

    return apply_filters('embed_brightcove', $embed, $matches, $attr, $url, $rawattr);
}

TEST

$embed_code = wp_oembed_get('http://players.brightcove.net/1234567890123/default_default/index.html?videoId=1234567789012');

echo $embed_code; // nothing :(

J'ai un regEx travaillant sur regexr qui utilise:

(players.brightcove.net/)([^/]+)/([^/]+)/index\.html\?videoId=([\d]+)

et cherche:

http://players.brightcove.net/{account}/{player_id}/index.html?videoId={video_Id}

RESSOURCES

LA QUESTION

Comment puis-je faire en sorte que ce gestionnaire d'intégration personnalisé fonctionne correctement? Puis-je réparer mon regEx ou je n'appelle pas les méthodes correctement?


UPDATE: Experiment

J'ai rencontré VerbalExpressions il y a quelques temps et je voulais voir comment cela pourrait fonctionner. La version PHP est ici , mais elle utilise la version JS que je peux tester sur RegExr ou RegEx101 :

var tester = VerEx()
        .startOfLine()
        .maybe("http")
        .maybe("s")
        .maybe(":")
        .then("//players.brightcove.net/")
        .Word()
        .then('/')
        .Word()
        .then('/index.html?videoId=')
        .Word()
        .maybe('&')
        .anythingBut(" ")
        .endOfLine();

Bien que la compilation aboutisse à quelque chose qui fonctionne, elle nécessite encore un nettoyage. Il est essentiel de ne créer que des groupes de ce qui m'intéresse et de convertir certains groupes originaux en groupes non appariés.

// Before

/^(http)(s)?(\:\/\/players\.brightcove\.net\/)\w+(\/)\w+(\/index\.html\?videoId\=)\w+(\&)?([^\ ]*)$/gm

// After

/^(?:http)?(?:s)?(?:\:)?\/\/players\.brightcove\.net\/(\d+)\/(\w+)\/index\.html\?videoId\=(\d+)\&?[^\ ]*$/gm

UPDATE: SOLUTION

Modifié légèrement à partir de La réponse de @ birgire car le compte sera toujours numérique.

wp_embed_register_handler(
    'brightcove',
    '#https?://players\.brightcove\.net/([\d]+)/([^/]+)/index\.html\?videoId=([\d]+)#', 
    'wp_embed_handler_brightcove');
4
jgraup

Juste quelques notes ici:

  • Nous devons faire attention à utiliser % dans sprintf() pour éviter toute confusion avec les espaces réservés . Essayez de supprimer les styles CSS.

  • Il est parfois plus facile d'utiliser les # ou ~ délimiteurs dans les expressions régulières, au lieu du délimiteur /.

  • Puisque vous avez le (players.brightcove.net/) comme première correspondance, il est possible que cela ne corresponde pas à cette hypothèse:

    $account  = esc_attr( $matches[1] );
    

    Essayez plutôt:

    #https?://players\.brightcove\.net/([^/]+)/([^/]+)/index\.html\?videoId=([\d]+)#
    

Cela semble fonctionner dans l'éditeur de contenu:

add_action( 'init', function()
{
    wp_embed_register_handler( 
       'brightcove', 
       '#https?://players\.brightcove\.net)/([^/]+)/([^/]+)/index.html\?videoId=([\d]+)#', 
       'wp_embed_handler_brightcove' 
    );
} );

wp_embed_handler_brightcove() est la fonction de rappel définie par @jgraup ci-dessus.

Voici une réponse connexe réponse sur laquelle j'ai travaillé récemment.

Jouer avec PHPVerbalExpressions

@jgraup mentionne la librairie PHPVerbalExpressions - "Les expressions rationnelles PHP faciles" .

Voici une tentative d'utilisation:

$regex = new \VerbalExpressions\PHPVerbalExpressions\VerbalExpressions();

$regex->removeModifier( 'm' )
//      ->startOfLine()
      ->then( 'http' )
      ->maybe( 's' )
      ->then( '://players.brightcove.net/' )
      ->anythingBut( '/' )
      ->then( '/' )
      ->anythingBut( '/' )
      ->then( '/index.html?videoId=' )
      ->add( '([\d]+)' );
//      ->endOfLine();

Cela génère le motif suivant:

/(?:http)(?:s)?(?:\:\/\/players\.brightcove\.net\/)(?:[^\/]*)(?:\/)(?:[^\/]*)(?:\/index\.html\?videoId\=)([\d]+)/

ou si nous l'étendons:

/
   (?:http)
   (?:s)?
   (?:\:\/\/players\.brightcove\.net\/)
   (?:[^\/]*)
   (?:\/)
   (?:[^\/]*)
   (?:\/index\.html\?videoId\=)
   ([\d]+)
/

Nous devrions ajuster les clés correspondantes en conséquence avec $matches.

2
birgire