我不太擅长编码,但我需要用 PHP 编写一个简单的 preg_replace 语句,这将有助于我使用 WordPress 插件。基本上,我需要一些代码来搜索字符串、提取视频 ID,然后返回插入了视频 ID 的嵌入代码。
换句话说,我正在寻找这个:
[youtube=http://www.youtube.com/watch?v=VIDEO_ID_HERE&hl=en&fs=1]
并想用这个替换它(保持视频ID相同):
param name="movie" value="http://www.youtube.com/v/VIDEO_ID_HERE&hl=en&fs=1&rel=0
如果可能的话,如果您能解释一下如何在搜索模式中使用各种斜线、插入符和 Kleene 星号,即将其从 grep 翻译成英语,以便我可以学习,我将永远感激不已。 :-)
谢谢!
迈克
最佳答案
小心!如果这是一个需要用户输入的 BBCode 风格的系统,那么其他两种解决方案将使您容易受到 XSS 攻击。
您有多种方法可以保护自己免受这种情况的影响。让正则表达式明确禁止可能给您带来麻烦的字符(或者只允许那些对 youtube 视频 ID 有效的字符),或者实际清理输入并使用 preg_match 代替,我将在下面说明 RoBorg 正则表达式的情况。
<?php
$input = "[youtube=http://www.youtube.com/watch?v=VIDEO_ID_HERE&hl=en&fs=1]";
if ( preg_match('/\[youtube=.*?v=(.*?)&.*?\]/i', $input, $matches ) )
{
$sanitizedVideoId = urlencode( strip_tags( $matches[1] ) );
echo 'param name="movie" value="http://www.youtube.com/v/' . $sanitizedVideoId . '&hl=en&fs=1&rel=0';
} else {
// Not valid input
}
这是此类攻击的实际示例
<?php
$input = "[youtube=http://www.youtube.com/watch?v=\"><script src=\"http://example.com/xss.js\"></script>&hl=en&fs=1]";
// Is vulnerable to XSS
echo preg_replace('/\[youtube=.*?v=(.*?)&.*?\]/i', 'param name="movie" value="http://www.youtube.com/v/$1&hl=en&fs=1&rel=0', $input );
echo "\n";
// Prevents XSS
if ( preg_match('/\[youtube=.*?v=(.*?)&.*?\]/i', $input, $matches ) )
{
$sanitizedVideoId = urlencode( strip_tags( $matches[1] ) );
echo 'param name="movie" value="http://www.youtube.com/v/' . $sanitizedVideoId . '&hl=en&fs=1&rel=0';
} else {
// Not valid input
}
关于php - 用 PHP 编写一个简单的 preg_replace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/192228/