PHP basit bir preg_replace Yazma

4 Cevap php

Hey millet - Ben bir coder değilim, ama ben bir wordpress eklentisi ile bana yardımcı olacak PHP basit bir preg_replace açıklama yazmak gerekir. Temelde, bir dize için arama video kimliği çekin, ve bunun içine bir video kimliği ile embed kodu dönecektir kodu gerekir.

Yani diğer bir deyişle ...

I'm searching for this:
[youtube=http://www.youtube.com/watch?v=VIDEO_ID_HERE&hl=en&fs=1]

And want to replace it with this (keeping the video id the same):
param name="movie" value="http://www.youtube.com/v/VIDEO_ID_HERE&hl=en&fs=1&rel=0

Eğer mümkünse bunu öğrenebilirim, yani İngilizce grep onu çevirmek, arama desen çeşitli eğik, havuç, ve yıldız kullandım nasıl açıklamak mümkün olsaydı, ben sonsuza kadar minnettar olurdum. :-)

Thanks!
Mike

4 Cevap

DİKKATLİ OLUN! Bu kullanıcı girişi ile BBCode-tarzı sistemi ise, bu diğer iki çözüm XSS saldırılarına karşı savunmasız bırakacaktı.

Bu karşı kendinizi korumak için çeşitli yollar var. Regex açıkça belaya (ya da, bir youtube video kimliği için sadece bu geçerli izin), ya da aslında girdileri ve ben RoBorg en regex kapalı olacak aşağıda göstermek, hangi yerine preg_match kullanabilirsiniz karakterleri vermemek var.

<?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
}

Burada eylem bu tür saldırılara bir örnek

<?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
}

Kim ilk url sorgu dizesi her zaman bu formatta olacağını garanti: çünkü, eğer mümkünse, bu durumda normal ifadeleri avoind istiyorsunuz?

i'd use parse_url($originalURL, PHP-URL-QUERY); and then loop through the returned array finding the correct 'name=value' pair for the v part of the query string: something like:

$originalURL = 'http://www.youtube.com/watch?v=VIDEO_ID_HERE&hl=en&fs=1';

foreach( parse_url( $originalURL, PHP_URL_QUERY) as $keyvalue )
{
    if ( strlen( $keyvalue ) > 2 && substr( $keyvalue, 0, 2 ) == 'v=' )
    {
        $videoId = substr( $keyvalue, 2 );
        break;
    }
}

$newURL = sprintf( 'http://www.youtube.com/v/%s/whatever/else', url_encode( $videoId ) );

P.S. SO metin yazılmış, denenmemiş.

$embedString = 'youtube=http://www.youtube.com/watch?v=VIDEO_ID_HERE&hl=en&fs=1';
preg_match('/v=([^&]*)/',$embedstring,$matches);
echo 'param name="movie" value="http://www.youtube.com/v/'.$matches[1].'&hl=en&fs=1&rel=0';

Bunu deneyin.

Regex /v=([^&]*)/ bu şekilde çalışır:

  • o v= arar
  • daha sonra $matches için parantez içinde desen maçı kaydeder
  • [^&] except işareti ('&') herhangi bir karakteri eşleştirmek için söyler
  • * maçta bu karakterlerden herhangi sayıda yerde 0'dan istediğimiz söyler

Bir uyarı. Sonra metin .*? hemen bulunmazsa, regex motoru muhtemelen bir sonraki [youtube...] etiketi atlama, bütün hattı üzerinden aramaya devam edecektir. Bu [^\]]*? parantez içinde arama sınırlamak için kullanmak genellikle daha iyidir.

Dayanarak RoBorgs cevap:

$str = preg_replace('/\[youtube=[^\]]*?v=([^\]]*?)&[^\]]*?\]/i', ...)

[^\]] ']' dışında herhangi bir karakterle eşleşir.