正则表达式 - 在href中匹配标记'a'而不使用https://

时间:2014-07-28 11:26:08

标签: php regex

我有例如这些" a"标记:

<a href="http://www.domain.com/products/foo">Foo product</a>
<a href="/articles/bar">Bar article</a>

我使用这种模式:

/<a\s[^>]*href\s*=\s*(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU

这个表达式向我返回两个标签(foo产品和条形文章)。 你可以帮我请一下如何制作一个只返回标签的表达式&#34; bar article&#34;?

谢谢。

编辑:

@Avinash Raj感谢您提示。

这种模式的结果对我有用:

/^.*<a\s[^>]*href="http:\/\/.*$(*SKIP)(*F)|<a\s[^>]*href\s*=\s*(\"??)([^\" >]*?)\1[^>]*>(.*?)<\/a>/miU

2 个答案:

答案 0 :(得分:1)

使用DOM解析器,例如DOMDocument

<?php
$site = <<<'EOT'
<a href="http://www.domain.com/products/foo">Foo product</a>
<a href="/articles/bar">Bar article</a>
EOT;

$doc = new DOMDocument();
$doc->loadHTML($site);

$anchors = $doc->getElementsByTagName('a');
foreach ($anchors as $a) {
    $href = $a->getAttribute('href');
    $scheme = parse_url($href, PHP_URL_SCHEME);
    if (!isset($scheme)) {            
        echo $a->textContent;   // output: Bar article
    }
}

遍历每个<a>元素。使用parse_url解析网址。如果未在href属性中设置方案,则回显内容。当然,你真正想要对元素做什么完全取决于你。

答案 1 :(得分:0)

您可以使用

<a href="(.*)<\/a>

使用preg_match_all,然后使用

从$ matches数组中获取最后一个结果
$web =   '<a href="http://www.domain.com/products/foo">Foo product</a>
          <a href="/articles/bar">Bar article</a>';
preg_match_all("/<a href=\"(.*)<\/a>/", $web , $matches); 

print_r( $matches[0][count($matches[0])-1]); // should only give Bar article

但是有人已经指出:不要使用正则表达式来搜索DOM。请改用DOM解析器!