Вставить код регулярное выражение не будет работать - PullRequest
0 голосов
/ 17 августа 2010

У меня есть регулярное выражение, которое я написал для извлечения значений, которые вводит пользователь, замены некоторых значений высоты и ширины и сохранения URL-адресов.Это можно безопасно добавить в базу данных.

Это то, что я имею до сих пор (просто пытаюсь получить preg_match для возврата значения TRUE)

$test ='<object height="81" width="100%"> <param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false"></param> <param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false" type="application/x-shockwave-flash" width="100%"></embed> </object>'; 
  if (preg_match('/<object height=\"[0-9]*\" width=\"[0-9]*\"><param name=\"movie\" value=\"(.*)\"><\/param><param name=\"allowscriptaccess\" value=\"always\"><\/param><embed allowscriptaccess=\"always\" height=\"[0-9]*\" src=\".*\" type=\"application\/x-shockwave-flash\" width=\"100%\"><\/embed><\/object>/', $test)) {

$embed = $test;

} else {

$embed = 'FALSE';

}

Мне кажетсясделали что-то не так в проверке, так как она всегда возвращает false.

Ответы [ 4 ]

1 голос
/ 09 апреля 2011

Это то, что я использую, замените $url на любой используемый вами var:

if ( strtolower(str_ireplace('www.', '', parse_url($url, PHP_URL_HOST))) == 'soundcloud.com' ) { ?>
    <embed id="swf_u621112_1" width="890" height="84" flashvars="width=398&height=84" wmode="opaque" salign="tl" allowscriptaccess="never    " allowfullscreen="true" scale="scale" quality="high" bgcolor="#FFFFFF" name="swf_u621112_1" style="" src="http://player.soundcloud.com/p    layer.swf?url=<?php echo htmlspecialchars(urlencode($url)) ?>" type="application/x-shockwave-flash">
<?php
}
1 голос
/ 17 августа 2010

Первое, что я вижу, что потерпит неудачу:

width="100%"  will not match /width=\"[0-9]*\"/

Я не знаю точного определения PHP регулярного выражения;Но я не уверен, что это будет совпадать (пробел в выражении reg может совпадать с нулем или большим количеством пробелов в целевом тексте, но наоборот не сработает):

> <param      will not match (probably) /><param/

Как вы видите, разборXML с регулярными выражениями сложен и подвержен ошибкам.
Что вы действительно хотите сделать, так это использовать синтаксический анализатор XML SAX.

Попробуйте: PS Мой PHP не очень хорош, поэтому он может содержать ошибки.

PS.Длинные URL не были правильно закодированы для XML.Я использовал urlencode () здесь, чтобы остановить сообщения об ошибках.Я не проверял, имеет ли это смысл.

<?php

$test = '<object height="81" width="100%">'
            .'<param name="movie" value="'
                .urlencode('http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false')
            .'">'
            .'</param>'
            .'<param name="allowscriptaccess" value="always">'
            .'</param>'
            .'<embed allowscriptaccess="always" height="81" src="'
                .urlencode('http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fsoundcloud.com%2Ftheshiverman%2Fsummer-beats-july-2010&secret_url=false')
                .'" type="application/x-shockwave-flash" width="100%">'
            .'</embed>'
        .'</object>';

function JustPrint($parser,$data)
{
    print $data;
}

function OpenTag($parser,$name ,$attribs)
{
    // For special tags add a new attribute.
    if (strcasecmp($name, "object") == 0)
    {
        $attribs['Martin'] = 'York';
    }


    // Print the tag.
    print "<$name ";
    foreach ($attribs as $loop => $value)
    {
        print "$loop=\"$value\" ";
    }
    print ">\n";
}

function CloseTag($parser,$name)
{
    print "<$name/>\n";
}

$xmlParser  =  xml_parser_create();
xml_set_default_handler($xmlParser ,'JustPrint'  );
xml_set_element_handler($xmlParser, 'OpenTag'  , 'CloseTag'  );
xml_parse($xmlParser, $test);

?>
0 голосов
/ 23 августа 2010

Если вы хотите, чтобы пользователь дал вам встраивание SoundCloud, в то время как вы сохраняете права на стилизацию проигрывателей, вы можете захотеть изучить oEmbed, который хорошо поддерживается SoundCloud ( см. Здесь ) и другие стороны.Таким образом, пользователи просто вводят свои обычные URL-адреса треков, и вы можете разрешить их в бэкэнде так, как считаете нужным.

Также имейте в виду, что код для встраивания с другим порядком <param> по-прежнемудопустимый код для встраивания, но его будет очень сложно сопоставить с регулярным выражением

0 голосов
/ 17 августа 2010

Я не хочу манипулировать этим, если это возможно (просто замените значения высоты. Я хочу, чтобы оно оставалось таким же, как оно есть, я использую регулярные выражения, чтобы минимизировать SQL-инъекции и убедиться, что это код для встраивания.

Может ли оно быть не просто обработано как строка и сохранено в точности как есть, но проверено на что-то?

Например, это работает со ссылкой для вставки YouTube:

/preg_match(<object width=\"([0-9]*)\" height=\"([0-9]*)\"><param name=\"movie\" value=\"(.*)\"><\/param><param name=\"allowFullScreen\" value=\".*\"><\/param><param name=\"allowscriptaccess\" value=\".*\"><\/param><embed src=\".*\" type=\".*\" allowscriptaccess=\".*\" allowfullscreen=\".*\" width=\"[0-9]*\" height=\"[0-9]*\"><\/embed><\/object>/',$test,$preg_out)

preg_match [0] preg_match [1] preg_match [3]

возвращает высоту ширины и URL объекта.

...