3

私のプロジェクトで行った正規表現に少し問題があります(次の例に示す正規表現の初心者であることを覚えておいてください)。関連するパターンを使用して特定の部分を抽出しようとしている xml コードに少し問題があります。

<banner piclink="pic" urlactive="url_active" urltarget="globaltgt" urllink="globallink" timevar="globaldelay" swf="0" smooth="1" name="name" alt="alternate" />

次の正規表現を使用して、preg_match_all を使用して piclink、urlactive、urltarget、urllink、および timevar を取得しています。

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>.*)\"/iU

これまでのところ、すべてが正しく機能していますが、常に表示されるとは限らないため、オプションの名前と alt タグを関連付けてキャプチャしようとしています。それらを括弧に入れてから ? を付けようとしました。次のようにオプションであることを示します。

(name=\"(?<name>.*)\")?

ただし、 $matches['name'] 配列は常に空です。どこで混乱しているのかわかりませんが、あらゆる種類の組み合わせを試しましたが、(?: を終了し、swf= 以降のすべてをカプセル化すると、結果が $matches['name'][X] = result のようになるため、受け入れられない配列で 115 のような結果が返されます。ここで、x は 1 である場合があり、109 である場合もあります。何らかの理由で。

4

1 に答える 1

1

のような方が良いことに同意しSimpleXMLますが、汚したい場合は、先読みを使用して残りの文字と一致させることができます。

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>[^"]*)\"(?=(.*name=\"(?<name>[^"]*)\")?)(?=(.*alt=\"(?<alt>[^"]*)\")?).*/iU
于 2012-05-02T00:40:17.317 に答える