THE GOAL
我正在尝试解析url并将其转换为
embedded 我的帖子内容中有视频播放器,但我认为我的正则表达式已关闭,或者我没有创建
provider 正确地
THE CODE
这是我现在的设置。
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);
}
<小时>
TESTING
$embed_code = wp_oembed_get(\'http://players.brightcove.net/1234567890123/default_default/index.html?videoId=1234567789012\');
echo $embed_code; // nothing :(
我有一个正则表达式正在处理
regexr 其使用:
(players.brightcove.net/)([^/]+)/([^/]+)/index\\.html\\?videoId=([\\d]+)
并查找:
http://players.brightcove.net/{account}/{player_id}/index.html?videoId={video_Id}
RESOURCES
THE QUESTION
如何使此自定义嵌入处理程序正常运行?我可以修复我的regEx吗?或者我没有正确调用这些方法吗?
<小时>
UPDATE: Experiment
我遇到了
VerbalExpressions 不久前,我想看看这是怎么回事。PHP版本为
here, 但这是我可以测试的JS版本
RegExr 或
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();
虽然它可以编译成一些有用的东西,但仍需要一些清理。Essential只对我感兴趣的事物进行分组,并将一些原始组转换为非匹配组。
// 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
略微修改自
@birgire\'s answer 因为帐户将始终是数字。
wp_embed_register_handler(
\'brightcove\',
\'#https?://players\\.brightcove\\.net/([\\d]+)/([^/]+)/index\\.html\\?videoId=([\\d]+)#\',
\'wp_embed_handler_brightcove\');
最合适的回答,由SO网友:birgire 整理而成
这里只有几条注释:
我们必须小心使用% 在内部sprintf() 避免与占位符混淆。尝试删除CSS样式。
有时使用# 或~ 正则表达式中的分隔符,而不是/ 分隔符。
既然你有(players.brightcove.net/) 作为第一个匹配项,它可能与以下假设不匹配:
$account = esc_attr( $matches[1] );
请尝试:
#https?://players\\.brightcove\\.net/([^/]+)/([^/]+)/index\\.html\\?videoId=([\\d]+)#
这似乎在内容编辑器中起作用:
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() 是上面@jgraup定义的回调函数。
这里有一个相关的answer 我最近工作过。
下面是使用它的尝试:
$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();
这将生成以下模式:
/(?:http)(?:s)?(?:\\:\\/\\/players\\.brightcove\\.net\\/)(?:[^\\/]*)(?:\\/)(?:[^\\/]*)(?:\\/index\\.html\\?videoId\\=)([\\d]+)/
或者如果我们扩展它:
/
(?:http)
(?:s)?
(?:\\:\\/\\/players\\.brightcove\\.net\\/)
(?:[^\\/]*)
(?:\\/)
(?:[^\\/]*)
(?:\\/index\\.html\\?videoId\\=)
([\\d]+)
/
我们必须相应地调整匹配的键
$matches.