2016-10-29 5 views
0

私はしばしばregexの新機能ですので、作成した正規表現の表現にいくつか問題があります。Regex Noncapturing inside with OR

私は自分自身を作成し​​、以下の式持って撮影し

SRC = "aifwoenflkwenflk"

以下の式の太字部分のようになる:それは作品

((?<=src=)|(?<=href=))"(.*?)((?=")|(?='))" 

を2つの問題があります。

  1. は、それは私は、単一または二重引用符

は私が行うことができ、新しい表現を作成しサポートするためにそれを必要とする(イージーフィックス)

  • 両方の引用符を引用符の内側のみをキャプチャする必要があるが、キャプチャ正確に私が望むもの:

    非常に長いですが。それを最適化するには、一重引用符や二重引用符を使用できるようにする方法がいくつかあり、内部だけを取り込む必要があります。私はこれをどのように達成できるのか誰も知っていますか?

    私はすべての助けに感謝します!

  • +0

    多分 '(:?SRC | HREF)=( "| ')(。+?)\ 1'? – chris85

    +0

    片方向は間違いなく最適化します。代わりにパーサーを使用します... – Jan

    答えて

    0
    $regex = '/(?:src|href)=["\']?([^"\'>]+)["\']?/'; 
    

    DEMO

    +0

    これはどのようにしてhrefもサポートしますか? – Bug

    1

    いつものように、優しくならびに単一引用符で動作しますこれは、代わりにまともなDOMパーサを使用することを検討してください:

    <?php 
    
    $data = <<<DATA 
    <a href="some string here">some link here</a> 
    <img src="some so'urce here"> 
    <a href="some other string here">some link here</a> 
    DATA; 
    
    $doc = new DOMDocument(); 
    $doc->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
    
    $xpath = new DOMXPath($doc); 
    
    # links 
    foreach ($xpath->query("//a[@href]") as $item) { 
        $source = $item->getAttribute('href'); 
        echo $source; 
    } 
    
    # images 
    foreach ($xpath->query("//img[@src]") as $item) { 
        $source = $item->getAttribute('src'); 
        echo $source; 
    } 
    ?>