YouTube регулярное выражение проглатывает оставшийся текст - PullRequest
1 голос
/ 20 сентября 2011

Я делаю preg_match_all и str_replace для блока текста, чтобы получить URL-адреса YouTube и заменить их на правильный код для вставки.

Допустим, у меня есть следующий блок текста:

"bla bla bla bla <-youtube-url-> last few words"

Все работает нормально - URL-адрес youtube заменяется на код для встраивания и т. Д. Однако " последние несколько слов " исчезают из окончательного вывода после запуска str_replace.Я подозреваю, что регулярное выражение глотает все после URL ... Это то, что я использую для сопоставления и извлечения идентификаторов YouTube:

%(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i

Любая помощь будет принята с благодарностью!

Обновление:

Я только что обнаружил, что проблема возникает, только если в URL-адресе YouTube есть какие-либо конечные параметры.Следующий ввод глотает последние несколько слов :

'www.youtube.com/watch?v=XXXXXXXXX&parameter=data last few words'

Но если ввод такой:

'www.youtube.com/watch?v=XXXXXXXXX last few words'

, он работает нормально.Может кто-нибудь помочь с необходимыми корректировками для регулярного выражения?

Ответы [ 4 ]

1 голос
/ 20 сентября 2011

Я обычно разбиваю сложные чередования, чтобы выяснить, что происходит.
Похоже, у вас может быть трупле с последним термином [^"&?/ ]{11}, но вы не уверены
в том, что вы пытаетесь сделать.(ниже в Perl)

$samp = 'www.youtube.com/watch?v=XXXXXXXXX&parameter=data last few words';

$regex = qr%

(?:
    youtube\.com/
    (?:
        ( [^/]+/.+/ )    # 1
      | 
        (                # 2 
            v
          | e(?:mbed)?/
        )
      |
        ( .*[?&]v= )     # 3
    )
  |

    ( youtu\.be/ )     #4
)

( [^"&?/ ]{1,11} )     # 5, was {11}

(.*)$                  # 6 the remainder

%xi;


if ( $samp =~ /$regex/ )
{
  # just print what matched
    print "all: '$&' \n";
    print "1:   '$1' \n";
    print "2:   '$2' \n";
    print "3:   '$3' \n";
    print "4:   '$4' \n";
    print "5:   '$5' \n";
    print "6:   '$6' \n";
}

Вывод:

all: 'youtube.com/watch?v=XXXXXXXXX&parameter=data last few words'
1:   ''
2:   ''
3:   'watch?v='
4:   ''
5:   'XXXXXXXXX'
6:   '&parameter=data last few words'
1 голос
/ 20 сентября 2011

Измените .+ на \S+, чтобы не захватывать пробелы как часть регулярного выражения.

%(?:youtube\.com/(?:[^/]+/\S+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i

.* захватывал всю строку, а остальная часть вашего регулярного выражения ничего не делала.

1 голос
/ 20 сентября 2011

Мне не ясно, что именно вы пытаетесь сделать.Но я предлагаю вам попробовать инструмент тестирования регулярных выражений - например, этот , но есть и другие.это позволяет вам визуально изучить результаты регулярных выражений.

enter image description here

0 голосов
/ 20 сентября 2011

Мой плохой.Как я и подозревал, с регулярным выражением проблем не было.

Я передавал пользовательский ввод в обработчик PHP, не экранируя его сначала с помощью encodeURIComponent () .Таким образом, обработчик предположил, что &parameter=data был следующим входным параметром, что привело к неправильной переменной POST.

Извините за мою некомпетентность, и спасибо за помощь!

...