PHP explode () не находит разделитель - PullRequest
1 голос
/ 26 мая 2009

Я создаю блог, который должен анализировать теги bbcode следующим образом:

Ввод: <youtube=http://www.youtube.com/watch?v=VIDEO_ID&feature=channel>
Выход:

<object width="400" height="245">
<param name="movie" value="http://www.youtube-    nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0"></param>
<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube-nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="245"></embed>
</object>

Моя функция до сих пор невероятно проста, потому что я застрял на самой легкой части! Прямо сейчас у меня есть функция главного процесса, которая вызывает функции разностного процесса. В этом случае одним из них является processYouTubeVideos (). Поэтому я называю это так:

$str = eregi_replace('\<youtube=([^>]*)\>', processYouTubeVideos("\\1"), $str);

processYouTubeVideos () прекрасно получает URL-адреса из тега youtube, но по какой-то причине при использовании explode () (или split) разделитель не обнаруживается Даже используя такие тестовые значения, как "u" или "tube" ...

function processYouTubeVideos ($str) {

    $params = explode("?", $str);
    $params = explode("&", $params[1]);

    return $params[0];

}

Ответы [ 2 ]

3 голосов
/ 26 мая 2009

Попробуйте:

$str = preg_replace('/<youtube=([^>]*)>/e', 'processYouTubeVideos("$1")', $str);

Код, который вы пытаетесь запустить, не будет работать, потому что функция в выходной строке будет вызываться на целевом шаблоне, а не на выходе. Это означает, что вы отправляете "\ 1" буквально в функцию. Добавьте var_dump($str); в начало функции и попробуйте снова запустить свой код, и вы это ясно увидите.

preg_replace имеет специальный флаг "e", который вы можете использовать для выполнения функции каждый раз, когда производится замена. Это работает путем вставки подшаблона в позицию маркера ($ 1) и последующего выполнения кода типа eval() или create_function() для его выполнения и получения результата. Затем он отправляется обратно на preg_replace() и производится фактическая замена.

0 голосов
/ 26 мая 2009

Функция processYouTubeVideos ("\ 1") запускается до eregi_replace.

Следующее делает то, что, как я полагаю, вы намерены:

$str = eregi_replace('\<youtube=([^>]*)\>', "\\1", $str);
$str = processYouTubeVideos($str);

Выполняет замену, а затем отправляет полученное значение в processYouTubeVideos.

...