2012-04-27 5 views
0

htmlタグから著者名を抽出します。タグは次のようになります。preg_matchは空のマッチをもう1つ表示します

<a href="http://somewhere.com"> Manfred </a> 

が、名前が長いのであれば、それは次のようになります。

<a title="floormanager004" href="http://somewhere.com"> floormanage... </a> 

私は両方のケースをカバーするために、次の正規表現を持っている:

~<a.*(title="(.{2,50})".*|>(.*))</a>~Usi 

これは2番目のケースでうまく動作し、次のような2次元配列を返します。

array(2) { 
    [0]=> 
    string "title="floormanager004" href="http://somewhere.com"> floormanage... " 
    [1]=> 
    string "floormanager004" 
} 

しかし、最初のケースのために、配列は、追加の空のフィールドが含まれます。

array(2) { 
    [0]=> 
    string "> Manfred " 
    [1]=> 
    string "" 
    [2]=> 
    string " Manfred " 
} 

はなぜ、このフィールドは表示されず、どのようにそれを取り除くためには?

免責事項:あなたはつもりbaaaaad時間を持っているhtmlの解析する正規表現を使用して、あなたが今までに今までにこれを行うべきではありませんが、私の場合、XPATHなどよりも高速であることが証明されていますときに私が知っている 。これにコメントしないでください。

+1

最初のタグはあなたの正規表現で検索する 'title'属性を持っていません。つまり、そこになければ、結果に空のエントリがあります。 – Nadh

答えて

0

goodfoldのManfredのtitle属性がありません。

これは、そのような場合のために働く:私はこのことについて非常にすることはできません

~<a.*>(.*)</a>~Usi 

:StackOverflowの上の投票で最も2番目の質問を参照してください。私はあなたが全体を読むことをお勧め:

RegEx match open tags except XHTML self-contained tags

+0

私はあなたに同じことを提案します、特に2番目の答え;)これで反射して返事を止めてください。文書要素のすべてを解析したくない場合がたくさんありますが、 。この場合、XML解析ではオーバーヘッドが大きくなります。 – Thomas

1

括弧のすべてのセットが返される配列に、全体の正規表現に成功した試合がありますたびに関連付けられた値を持っているとしている、でも何括弧で囲まれたビットと一致した場合なんでもない。キャプチャの一部が空の場合、コードでそのケースを検出して処理する必要があります。

+0

ありがとうございます。だから正規表現でそれを行う方法はありません?最初のパス 'title ="(。{2,50}) "。*'は_Manfred_のために全く一致してはいけません。 – Thomas

+0

アップ、私の答えを書式設定するのを忘れてしまった。今あなたは私が何をしたかを見ておくべきです。 – Dariop

+0

何かにマッチした位置だけを返す正規表現を構築することはできません。それが1つだけ返ってきた場合、それがどのカッコから来たのかあなたはどのように分かりますか?それに加えて、 "nothing"とのマッチングはまだ成功しているので、マッチしたものを返します。 –