0

このコードに問題があり、PHP メソッド 'substr' が再生されています。私はそれを理解していません。ここでは、私が達成しようとしていることを簡単に紹介します。Joomla からの電子メール購読者を含むこの巨大な XML ドキュメントがあります。Mailchimp にインポートしようとしていますが、Mailchimp にはメールをリストにインポートする方法の構文に関するいくつかの規則があります。したがって、現時点では構文は次のようになります。

<subscriber>
    <subscriber_id>615</subscriber_id>
    <name><![CDATA[NAME OF SUBSCRIBER]]></name>
    <email>THE_EMAIL@SOMETHING.COM</email>
    <confirmed>1</confirmed>
    <subscribe_date>THE DATE</subscribe_date>
</subscriber>

これらすべてのメールを受け取り、次のように出力する単純な PHP スクリプトを作成したいと思います。

  [THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
  [THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
  [THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
  [THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]

それができれば、Mailchimp にコピー ペーストするだけです。

これまでの私のPHPスクリプトは次のとおりです。

$fileName = file_get_contents('emails.txt');

foreach(preg_split("/((\r?\n)|(\r\n?))/", $fileName) as $line){

  if(strpos($line, '<name><![CDATA[')){
      $name = strpos($line, '<name><![CDATA[');
      $nameEnd = strpos($line, ']]></name>', $name);
      $nameLength = $nameEnd-$name;
      echo "<br />";
      echo " " . strlen(substr($line, $name, $nameLength));
      echo " " . gettype(substr($line, $name, $nameLength));
      echo " " . substr($line, $name, $nameLength);


  }
  if(strpos($line, '<email>')){
    $var1 = strpos($line, '<email>');
    $var2 = strpos($line, '</email>', $var1);
    $length = $var2-$var1;
    echo substr($line, $var1, $length);

  }
} 

最初の if ステートメントは正常に機能します。行に「」タグがあるかどうかを識別し、ある場合は終了タグを見つけて、substr メソッドを使用して電子メールを出力します。

2 番目の if 文が気になります。If は最初の if ステートメントと同じことを行うべきですが、そうではありません。長さは正しい長さです(私が確認しました)。タイプは正しいタイプです(私はチェックしました)。しかし、それをエコーし​​ようとすると、何も起こりません。スクリプトは引き続き実行されますが、何も書き込まれません。

私はそれをかなりいじって、すべてを試したようです-しかし、私はそれを理解することができません.

4

2 に答える 2

3

警告
この関数は、ブール値の FALSE を返す場合がありますが、FALSE と評価されるブール値以外の値を返す場合もあります。詳細については、ブール値のセクションを参照してください。この関数の戻り値をテストするには、=== 演算子を使用します。

あなたが使用している必要がありますif(strpos($line,'...') !== false) {

それはさておき、あなたのファイルは XML のように見えるので、XML パーサーを使用する必要があります

DOMDocument良いものです。次のようなことができます。

$dom = new DOMDocument();
$dom->load("emails.txt");
$subs = $dom->getElementsByTagName('subscriber');
$count = $subs->length;
for( $i=0; $i<$l; $i++) {
    $sub = $subs->item($i);
    echo $sub->getElementsByTagName('email')->item(0)->nodeValue;
    echo " ";
    echo $sub->getElementsByTagName('name')->item(0)->nodeValue;
    echo "\n";
}

これにより、説明した形式で名前とメールが出力されます。

于 2012-10-22T19:54:49.620 に答える
1

したがって、これにはいくつかの問題があります。たとえば、行の先頭にタグが見つかった場合strposに実際に返されるコマンドが0、意図したものとは異なるように見えます。

また、XMLが現在のように正確にフォーマットされておらず、各開始タグと終了タグが1行にある場合、ロジックも失敗します。

このため、XML処理を再発明することはお勧めできません...

ここで他の人が提案しているように、問題のより良い解決策です*。

$xml = simplexml_load_file('emails.txt');
foreach( $xml->subscriber as $sub ) 
{
  // Note that SimpleXML is aware of CDATA, and only outputs the text
  $output = '[' . $sub->name . ']' . ' ' . '[' . $sub->email . ']'; 
}

*これは、XMLが有効であること、つまり「サブスクライバー」ブロックがトップレベルの単一の親に含まれていることを前提としています。もちろん、simplexmlドキュメントを使用して、ユースケースに合わせて調整することもできます。

于 2012-10-22T20:18:47.497 に答える