bugfix> php > 投稿

一部のRSSフィードWebサイトから説明を取得しています。これらの説明の一部には、削除したい画像や特定のテキストが含まれています。

フィードを取得するコード:

$rss = simplexml_load_file($website);
foreach ($rss->channel->item as $item) {
    $description = (string)$item->descritpion;
}

これらは私が得るさまざまな形式です:

<description><![CDATA[
    <p> //Post Description </p>
    <p>The post <a rel="nofollow" href="">
        //Post Title.</a> appeared first on 
        <a rel="nofollow" href="">//Feed Website.</a>.
    </p>
]]></description>
_________________________________________________________________
<description><![CDATA[
    <div>
        <strong>//Some Text.</strong>
    </div>
    <div>
        &nbsp;
    </div>
    <div>//Some Text.</div>
    <div>
        <img alt="" src="" style="width: 640px; height: 427px;" />
    </div>
]]></description>
_______________________________________________________________
<description>
    &lt;img style="margin:0 1em 1em 0;" align="left" src=""/&gt;
    „//Some Text. 
</description>

画像を削除するには:

$description = (string)strip_tags($item->description);

テキストは「投稿(投稿タイトル)が最初に表示された(ウェブサイト)」です。

私が使用するテキストを削除するには:

if (strpos($description, 'appeared first')) {
    $siteNames = array('a.com', 'b.com', 'c.com');
    foreach ($siteNames as $siteName) {
        if(strpos($description, $siteName)){
            $appeared = 'The post '.$item->title.' appeared first on '.$siteName;
            $description = str_replace($appeared, '', $description);
        }
    }
}

たとえば、説明に以下が含まれている場合:

<p>The post 
    <a rel="nofollow" href="http://a.com/what-is-php">What is PHP.</a> 
    appeared first on 
    <a rel="nofollow" href="http://a.com">a.com.</a>.
</p>

次に、そのテキストを削除する必要があります。

次に、 strip_tags($item->description) を使用します 、画像は表示されません。

しかし、コードを使用して文字列を削除すると、すべての説明で機能せず、一部の文字列がまだ残っています。

更新:

<description><![CDATA[
    <p>Við vorum að fá inn til okkar forfallaholl í Laugardalsá á best tíma. Annarsvegar er um að ræða hollið 18-21. júlí og síðan hollið 24-27. júlí. Bæði eru hollin á frábærum tíma í ánn. Þó svo um 3ja daga holl sé að ræða, er að hægt að skoða staka daga eða 1 1/2 eða 2
    </p>
    <p>The post <a rel="nofollow" href="https://a.com/post-title/">Laugardalsá &#8211; forfallaholl á besta tíma</a> appeared first on <a rel="nofollow" href="https://a.com">a.com</a>.</p>
]]></description>

回答 1 件
  • コード:(デモ)

    $xml = '<![CDATA[
        <p>Við vorum að fá inn til okkar forfallaholl í Laugardalsá á best tíma. Annarsvegar er um að ræða hollið 18-21. júlí og síðan hollið 24-27. júlí. Bæði eru hollin á frábærum tíma í ánn. Þó svo um 3ja daga holl sé að ræða, er að hægt að skoða staka daga eða 1 1/2 eða 2
        </p>
        <p>The post <a rel="nofollow" href="https://a.com/post-title/">Laugardalsá &#8211; forfallaholl á besta tíma</a> appeared first on <a rel="nofollow" href="https://a.com">a.com</a>.</p>
    ]]>';
    $finds = [
        '~<p>The post <a rel="nofollow" href="https?://[a-z]+\.com[^"]*">.*?</a> appeared first on <a rel="nofollow" href="https?://[a-z]+\.com[^"]*">.*?</a>\.</p>~iu',
        '~^<!\[CDATA\[~',
        '~\]\]>$~'
    ];
    var_export(trim(strip_tags(preg_replace($finds, '', $xml))));
    
    

    出力:

    'Við vorum að fá inn til okkar forfallaholl í Laugardalsá á best tíma. Annarsvegar er um að ræða hollið 18-21. júlí og síðan hollið 24-27. júlí. Bæði eru hollin á frábærum tíma í ánn. Þó svo um 3ja daga holl sé að ræða, er að hægt að skoða staka daga eða 1 1/2 eða 2'
    
    

    私はこれがあなたが必要とする方法であなたのデータを大部分処理することを期待しています。最初の正規表現パターンは間違いなく最も毛深いものです(パターンの説明についてはリンクを参照してください)。 [abc]\.com を調整する必要があります  ニーズに合わせて-潜在的に (?:test\.com|example\.net|sample\.co\.uk) のようなことをする 。 「適切」になるまで、入力データの一部をregex101に入力し、機能するまでパターンを微調整し続けます。

    2番目と3番目のパターンは、テキストラッパーを削除するためのものです。 strip_tags() のため、2番目は本当に必要ありませんが  その部分文字列を削除します。 strip_tags()  ぶら下がり ]]> を残します 。

    最初のパターンは大文字と小文字を区別しません( i )およびユニコード耐性( u )最良の結果を得るために。

    ^  および $  文字列の区切り文字の始まりと終わりです。実際のデータに適していない場合は、削除できます。これらの手順は、不要な残留部分文字列を「モップアップ」するだけです。ザ・ trim()  callは確かに、保存されたデータをできる限りクリーンにするために含めるものです。

    特定の <p>  削除するタグ付きサブストリングは、保持する2つのサブストリングの間にネストされています。複数の \s{2,} を圧縮するために別のパターンを追加することができます  単一のスペースにするか、 \s* と書くかもしれません  末尾の空白をキャプチャする最初のパターンの最後に。これを知っているのはあなただけです。

あなたの答え