Как я могу заменить ссылки на детей, чтобы создать подкаст-дружественный канал? - PullRequest
2 голосов
/ 26 ноября 2008

У меня есть источник RSS:

http://feedity.com/rss.aspx/mr1-kossuth-hu/VVdXUlY
<item>
      <title>2008. november 23.</title>
      <link>http://www.mr1-kossuth.hu/m3u/0039c36f_3003051.m3u</link>
      <description>........</description>
      <pubDate>Wed, 26 Nov 2008 00:00:00 GMT</pubDate>
    </item>

Исходя из этого, я хочу создать подкаст-дружественный канал. Я хочу заменить ссылку детей на:

http://stream001.radio.hu:8000/content/*.mp3

Пример:

<item>
      <title>2008. november 23.</title>
      <link>http://stream001.radio.hu:8000/content/0039c36f_3003051.mp3</link>
      <description>........</description>
      <pubDate>Wed, 26 Nov 2008 00:00:00 GMT</pubDate>
    </item>

Как я могу это сделать в PHP?

Ответы [ 4 ]

3 голосов
/ 27 ноября 2008

Это простое и чистое решение XSLT 1.0 , состоящее всего из 47 строк, половина из которых является закрывающими тегами. следующее преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output omit-xml-declaration="yes"/>

 <xsl:param name="pNewLink"
 select="'http://stream001.radio.hu:8000/content/'"/>

 <xsl:param name="pNewExt" select="'.mp3'"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="link">
      <xsl:copy>
         <xsl:copy-of select="@*"/>

         <xsl:variable name="vFName">
           <xsl:call-template name="GetFileName">
             <xsl:with-param name="pFPath" select="."/>
           </xsl:call-template>
         </xsl:variable>

         <xsl:value-of select="concat($pNewLink,$vFName,$pNewExt)"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template name="GetFileName">
      <xsl:param name="pFPath"/>

      <xsl:choose>
        <xsl:when test="not(contains($pFPath, '/'))">
          <xsl:value-of select="substring-before($pFPath, '.')"/>
        </xsl:when>

        <xsl:otherwise>
          <xsl:call-template name="GetFileName">
            <xsl:with-param name="pFPath"
             select="substring-after($pFPath, '/')"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

при применении к предоставленному исходному XML-документу :

<item>
    <title>2008. november 23.</title>
    <link>http://www.mr1-kossuth.hu/m3u/0039c36f_3003051.m3u</link>
    <description>........</description>
    <pubDate>Wed, 26 Nov 2008 00:00:00 GMT</pubDate>
</item>

дает желаемый результат :

<item>
    <title>2008. november 23.</title>
    <link>http://stream001.radio.hu:8000/content/0039c36f_3003051.mp3</link>
    <description>........</description>
    <pubDate>Wed, 26 Nov 2008 00:00:00 GMT</pubDate>
</item>

Обратите внимание на следующие особенности этого решения:

  1. Мы используем шаблон проектирования XSLT, используя и переопределяя преобразование идентичности .

  2. Шаблон с именем «GetFileName » извлекает из полного URL-адреса (переданного в качестве параметра) только имя файла с расширением файла. Этот является хорошим примером именованного шаблона, который рекурсивно вызывает себя .

  3. Составляющие желаемых новых URL указываются как глобальные <xsl:param> s
1 голос
/ 26 ноября 2008

Это то, что лучше всего делать с XSLT . Вы можете написать простое XSL-преобразование, чтобы сделать это, или вы можете сделать хакерский путь и использовать preg_match, preg_replace и друзей.

0 голосов
/ 26 ноября 2008
<?php
 $str = file_get_contents('http://feedity.com/rss.aspx/mr1-kossuth-hu/VVdXUlY');
 $xml = simplexml_load_string($str);
if ($xml) {

$intro = str_replace('<link>http://www.mr1-kossuth.hu/m3u/', '<enclosure url="http://stream001.radio.hu:8000/content/', $xml->asXML());
$intro = str_replace('m3u</link>', 'mp3" type="audio/mpeg" />', $intro);
echo $intro;    
} else {
    $error = "Could not load intro XML file.";
}

?>
0 голосов
/ 26 ноября 2008

Самый простой способ - заменить простую строку:

$str = file_get_contents('http://feedity.com/rss.aspx/mr1-kossuth-hu/VVdXUlY');
$str = str_replace('<link>http://www.mr1-kossuth.hu/m3u/', '<link>http://stream001.radio.hu:8000/content/', $str);
$str = str_replace('m3u</link>', 'mp3</link>', $str);

Готово! * * 1004

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...