2012-05-02 4 views
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']のように結果としてacceptabeではない配列に115の結果のように返されます(最後に?:を入れてswf =すべてのものをカプセル化した場合を除いて空の結果になります) [X] =結果、何らかの理由でxが時折109で1になる場合があります。

+0

正規表現を使用する必要がありますか?代わりにSimpleXMLを使用すると、すべての問題を簡単に解決できます。 –

+0

PHP内部でコードが生成されるxmlファイルはありません。データを格納するために多くのコードを変更することができますが、今すぐ正規表現を叩くことは、必要に合わせてクラス全体を再構築するよりも時間を節約します。うーん、私は文字列でsimplexmlを使うことができると思っていますが、不正なXMLコードが必要か、それとも完全なXMLが必要かと思います。 –

+0

'SimpleXML'はファイルだけでなく文字列でも操作できます。 –

答えて

1

私はSimpleXMLのようなものが良いと思っていますが、汚れてしまいたい場合は、先読みを使って残りの文字。

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>[^"]*)\"(?=(.*name=\"(?<name>[^"]*)\")?)(?=(.*alt=\"(?<alt>[^"]*)\")?).*/iU 
+0

ありがとう、私もそれを試みます。 –

+0

ungreedyで動作しません:(名前と配列の要素がまだ空です。) –

+0

オンラインの正規表現ツールで試したものは、オプションでungreedyの場合はオプションのグループをキャプチャしていないようです –