preg заменить не убегающий "?" в ссылках


У меня есть строка с большим количеством текста, bbcodes и URL-адресов, и я извлекаю идентификаторы из bbcode-Youtube-URL, а затем заменяю bbcode встроенным iframe youtube. пока все идет хорошо, это работает.

Но для моего сайта мне нужно добавить "?wmode=непрозрачный" в iframe src="//www.youtube.com/embed /$1" атрибут, но "?" не работает с preg_replace.

Это основной код:

function youtube_bbcode_format($str){

   // extract id
   $format_search =  array(
      '#\[youtube\].*[?&]v=([^?&]+)\[/youtube\]#i' // Youtube extract id
   );

   // replace string (youtube embed iframe) plus the ?wmode=opaque parameter
   $format_replace = array(
      '<iframe width="320" height="180" src="//www.youtube.com/embed/$1?wmode=opaque" frameborder="0" allowfullscreen></iframe>'
   );

   // do the replacement
   $str = preg_replace($format_search, $format_replace, $str);
   return $str;
}

Я пытался избежать "?" вопросительный знак рядом с /встраивать/$1 различными способами, следующие примеры НЕ работают : (1 доллар правильно заменен идентификатором youtube во всех примерах, я просто не записываю их каждый раз)

src="//www.youtube.com/embed/$1?wmode=opaque"

В браузере отсутствует все, что после $1, включая результат "?": /$1

src="//www.youtube.com/embed/$1\?wmode=opaque" 

Побег на самом деле не работает. результат: /$1\?wmode= непрозрачный (обратная косая черта должна исчезнуть!)

src="//www.youtube.com/embed/$1\\?wmode=opaque"

То же, что и раньше, результат: /$1\?wmode=непрозрачный

src="//www.youtube.com/embed/$1??wmode=opaque" 

Результат: /$1??wmode=непрозрачный

src="//www.youtube.com/embed/\${1}?wmode=opaque"

Результат: /${1}?wmode=непрозрачный

Последняя попытка была самой многообещающей, потому что в руководстве говорится, что это способ решения подобных проблем, но он не работает.

Есть идеи , как избежать "?" в строке замены?

ПС: Пример для входной строки:

    str = "music is by [color=blue][size=20][b]Pegboard Nerds - Hero (feat. Elizaveta)[/b][/size][/color]. you can listen to it here:[br][youtube]youtube.com/watch?v=5lLclBfKj48[/youtube]";

(другие теги bbcode обрабатываются в другом месте)

Author: user3450177, 2014-03-22

2 answers

Попробуйте это:

function youtube_bbcode_format($str){

   // extract id
   $format_search =  array(
      '#\[youtube\].*[?&]v=([^?&]+)\[/youtube\]#i' // Youtube extract id
   );

   // replace string (youtube embed iframe) plus the ?wmode=opaque parameter
   $format_replace = array(
      '<iframe width="320" height="180" src="//www.youtube.com/embed/$1'
   );

   // do the replacement
   $str = preg_replace($format_search, $format_replace, $str).'?wmode=opaque" frameborder="0" allowfullscreen></iframe>';
   return $str;
}
 0
Author: CMPS, 2014-03-22 17:50:46

Спасибо всем вам за проверку образца кода. С вами все было в порядке, сам фрагмент кода работает так, как ожидалось. Я был уверен, что проблема была в ссылках preg_replace, но я ошибался. Причина проблемы возникла из другой части моего исходного кода: $str был передан через другую функцию preg_replace, которая вырезала знак вопроса.

    preg_replace_callback("&\\b$rexProtocol$rexDomain$rexPort$rexPath$rexQuery$rexFragment(?=[?.!,;:\"]?(\s|$))&", 'callback', $str);

Функция preg_replace_callback должна была заменить текстовые ссылки реальными ссылками.. но если он назван в честь моего базовый код обрезан, все, что следует за "?" (включая его самого), отсутствовало.

Сам фрагмент кода действительно работает. Спасибо вам за помощь.

 0
Author: user3450177, 2014-03-23 18:10:23