不能在php正则表达式中使用OR(|)

时间:2013-04-30 16:58:48

标签: php regex hyperlink

我是新手。我在PHP中使用正则表达式时遇到了一个奇怪的问题。

$result = "some very long long string with different kind of links";

$regex='/<.*?href.*?="(.*?net.*?)"/'; //this is the regex rule

preg_match_all($regex,$result,$parts);

在这段代码中,我试图从结果字符串中获取链接。但它只会提供包含.net的链接。但我也希望得到那些有.com的链接。为此,我尝试了这段代码

    $regex='/<.*?href.*?="(.*?net|com.*?)"/';

但它没有显示任何内容。

我的英语不好。

提前致谢。

更新1:

现在我正在使用这个

$regex='/<.*?href.*?="(.*?)"/';

此规则从字符串中获取所有链接。但这并不完美。因为它还抓住了其他子串,如“javascript”。

4 个答案:

答案 0 :(得分:3)

|字符适用于捕获组中的所有内容,因此(.*?net|com.*?)将匹配.*?netcom.*?,我认为您想要的是(.*?(net|com).*?)

如果您不想要额外的捕获组,可以使用(.*?(?:net|com).*?)

您也可以使用(.*?net.*?|.*?com.*?),但不建议这样做,因为不必要的重复。

答案 1 :(得分:1)

您的正则表达式被解释为.*?netcom.*?。你需要(.*?(net|com).*?)

答案 2 :(得分:1)

试试这个:

$regex='/<.*?href.*?="(.*?\.(?:net|com)\b.*?)"/i';

或更好:

$regex='/<a .*?href\s*+=\s*+"\K.*?\.(?:net|com)\b[^"]*+/i';

答案 3 :(得分:0)

<.*?href

是个问题。这将匹配当前行中的第一个<与第一个href,无论它们是否属于同一个标记。

通常,尝试使用正则表达式解析HTML是不明智的;如果你绝对坚持这样做,至少要更具体(但仍然不完美):

$regex='/<[^<>]*href[^<>=]*="(?:[^"]*(net|com)[^"]*)"/';