1

この正規表現

(<link\s+)((rel="[Ii]con"\s+)|(rel="[Ss]hortcut [Ii]con"\s+))(href="(.+)")(.+)/>

のために働く

<link rel="icon" href="http://passets-cdn.pinterest.com/images/favicon.png" type="image/x-icon" />
<link rel="shortcut icon" href="http://css.nyt.com/images/icons/nyt.ico" />
<link rel="shortcut icon" href="http://cdn.sstatic.net/careers/Img/favicon.ico?36da6b" />
<link rel="Shortcut Icon" href="/favicon.ico" type="image/x-icon" />

ただし、href 属性と rel 属性が切り替えられる場所ではありません。

  <link href="/phoenix/favicon.ico" rel="shortcut icon" type="image/x-icon" />

or ステートメントが順序付けられないように更新するにはどうすればよいですか

となることによって

aa || bb

同様に動作します

bb || aa

ここでテストします:

http://regexpal.com/

favicon タグからパスを取得したいだけです...ライブラリを使用しないことを選択しました。

別の形式でのステマの答え:

<link\s+
    (
        ?=[^>]*rel="
        (
            ?:[Ss]hortcut\s
        )
        ?[Ii]con"\s+
    )
    (
        ?:[^>]*href="
        (
            .+?
        )"
    ).*
/>
4

4 に答える 4

4

単一の正規表現ではできません。まあ、実際にはできますが、それは本当に価値がなく、正規表現の読み取り不能な混乱になってしまいます.

と照合/<link\s([^>]+rel="(shortcut\s+)?icon"[^>]*)>/iし、キャプチャした部分を と照合し/\shref="([^"]+)"/iます。

于 2012-05-23T19:47:09.043 に答える
3

あなたは前向きな先読みでそれを行うことができます

<link\s+(?=[^>]*rel="(?:[Ss]hortcut\s)?[Ii]con"\s+)(?:[^>]*href="(.+?)").*/>

ここでRegexrを参照してください

パスは最初のキャプチャ グループにあります。

ここでの問題は、先読みが何にも一致しないということです。したがって、タグ内のどこかに存在するかどうかを確認できます。rel="(?:[Ss]hortcut\s)?[Ii]con"このパターンが見つかった場合は、その部分と一致しhref、リンクをキャプチャ グループ 1 に入れます。

(?=[^>]*rel="(?:[Ss]hortcut\s)?[Ii]con"\s+)これが肯定先読みアサーションです。?=これは、グループの先頭にあるによって示されます。

[^>].以外の任意の文字に一致する否定文字クラス>です。>これを使用して、タグの終了を渡さないようにします。

于 2012-05-23T19:58:17.470 に答える
2

1 つの正規表現を使用してアイコン タグを見つけ、2 つ目の正規表現を使用してパスを取得できます。

2 番目の正規表現が解析する唯一のテキストが単一のタグである場合/href="(.+)"/、タグ内の属性の順序は重要ではありません。

于 2012-05-23T19:45:34.833 に答える
1

PHP のSimpleXMLを使用することをお勧めします。

$html = '<link href="/phoenix/favicon.ico" rel="shortcut icon" type="image/x-icon" />';
$xml = new SimpleXMLElement($html);
echo $xml->attributes()->href;
于 2012-05-23T19:45:31.253 に答える