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 标签中提取路径...我选择不使用库。

Stema 的不同形式的回答:

<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

您可以使用一个正则表达式来定位图标标签,并使用第二个正则表达式来拉取路径。

如果您的第二个正则表达式解析的唯一文本是单个标记,则它可以很简单,/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 回答