1

OK、SimpleXML を使用して RSS フィードを解析しています。多くのフィードには埋め込み html が含まれているため、埋め込み html に含まれる画像アドレスを分離できるようにしたいと考えています。簡単な作業のように思えますが、SimpleXMLElement オブジェクトからのデータの解析で問題が発生しています。関連するコードは次のとおりです。

for($i = 0; $i < count($articles); $i++) {
    foreach($articles[$i] as $feedDeet) {
        $str = (string)$feedDeet;
        $result = strpos($str, '"');
        if($result === false) {
            echo 'There are apparently no quotes in this string: '.$str;
        }
        $explodedString = explode('"', $str);
        echo "<br>";
        if($explodedString[0] == $str) {
            echo 'ExplodedString is equal to str. Apparently, once again, the string contains no quotes.';
        }
        echo "<hr>";
    }
}

この場合、$articles は、それぞれが RSS 記事を表す SimpleXMLElement オブジェクトの配列であり、その記事のプロパティと詳細を表す多くの子 SimpleXMLElement オブジェクトを含みます。基本的に、これらのプロパティを 1 つずつ反復処理し、文字列としてキャストしてから、引用符を区切り文字として使用して文字列を分解したいと考えています (イメージ アドレスは引用符で囲まれるため)。次に、展開された配列を解析し、画像アドレスと思われる文字列を検索します。ただし、explode() も strpos() も期待どおりに動作していません。私が言いたいことの例を挙げると、上記のコードの出力の 1 つが次のようになります。

There are apparently no quotes in this string: <p style="text-align: center;"><img class="alignnone size-full wp-image-243922" alt="gold iPhone Shop Le Monde" src="http://media.idownloadblog.com/wp-content/uploads/2013/08/gold-iPhone-Shop-Le-Monde.jpg" width="593" height="515" /></p> <p>Folks still holding out hope that the gold iPhone rumors aren’t true may want to brace themselves, the speculation has just been confirmed by the Wall Street Journal-owned blog AllThingsD. And given the site’s near perfect (perfect?) track record with predicting future Apple plans, and <a href="http://www.idownloadblog.com/2013/08/16/is-this-apples-gold-colored-iphone-5s/">corroborating evidence</a>, we’d say Apple is indeed going for the gold…(...)<br/>Read the rest of <a href="http://www.idownloadblog.com/2013/08/19/allthingsd-gold-iphone-yes/">AllThingsD confirms gold iPhone coming</a></p> <hr /> <p><small> "<a href="http://www.idownloadblog.com/2013/08/19/allthingsd-gold-iphone-yes/">AllThingsD confirms gold iPhone coming</a>" is an article by <a href="http://www.idownloadblog.com">iDownloadBlog.com</a>. <br/>Make sure to <a href="http://twitter.com/iDownloadBlog">follow us on Twitter</a>, <a href="http://www.facebook.com/iPhoneDownloadBlog">Facebook</a>, and <a href="https://plus.google.com/u/0/b/111910843959038324995/">Google+</a>. </small></p>
ExplodedString is equal to str. Apparently, once again, the string contains no quotes.

少し読みづらかったら申し訳ありませんが、出力から逐語的にコピーされています。

ご覧のとおり、問題の文字列には明らかに引用符がありますが、strpos は false を返します。つまり、指定された文字列が見つからなかったことを意味し、explode は元の文字列を内部に含む配列を返し、指定された区切り文字が見つかったことを示します。見つかりません。ここで何が起こっているのですか?私はこれに何時間も困惑しており、正気を失っているように感じます.

ありがとう!

4

1 に答える 1

1

ここで犯した間違いは、デバッグ出力が HTML ページであるため、出力するメッセージがブラウザによって HTML として解釈されていることです。実際のコンテンツを表示するには、ページのソースを表示するか、<pre>タグを使用して空白を保持しhtmlspecialchars()、HTML エスケープのレイヤーを追加する必要があります。echo '<pre>' . htmlspecialchars($str) . '</pre>';

ブラウザの出力が のように見える場合<p style="text-align: center;">、入力は明らかに HTML エンティティで既にエスケープされており、おそらく実際には のようになって&lt;p style=&quot;text-align: center;&quot;&gt;います。のように&quot; 見えます"が、同じ文字列でstrpos()はないので見つかりません。

この余分なエスケープ層を取り消すためhtml_entity_decode()に、文字列を処理する前に実行できます。

于 2013-08-19T19:00:16.150 に答える