preg_match查找图像和网址的链接

时间:2013-09-19 12:44:16

标签: php preg-match

我正在尝试使用preg_match来查找内部提到的网址和标记,以便我可以用更新的域名替换它们。现在我只是想在href标签中找到这个问题的搜索脚本,以便我可以打印找到的网址。这就是我所拥有的:

$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';

$prod['value']指的是我试图筛选的内容

1 个答案:

答案 0 :(得分:2)

您的代码

$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';

首先,$matches调用之前不需要定义preg_match。您只需提供变量名称,PHP就不会抛出通知

其次,$search似乎与问题无关?

第三......考虑到你没有显示示例输入我将做出一个假设,你实际上想要preg_match_all,这样你就可以获得一个列表输入中的所有URLs

第四,继三个之后,这意味着您需要var_dumpprint_r而不是echo,因为$matches[X]的内容将是array

正则表达式

好的,现在你的正则表达式实际上做了什么...

(<a\s*[^>]*href=['"]?)
  • ( - 启动捕获组
  • <a\s* - 匹配<a后跟 0或更多空白字符
  • [^>]* - 匹配 0或更多不是>的字符
  • href= - 匹配href=
  • ['"]? - 可选择匹配'"
  • ) - 结束捕获组

这一切意味着针对示例输入运行您的正则表达式将匹配来自第一个链接示例(谷歌)的<a href="和来自第二个链接示例(youtube)的<a class="fancyStyle" href="

/**
Output from:

preg_match_all('|(<a\s*[^>]*href=[\'"]?)|', $string, $matches);
var_dump($matches);

*/
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(9) "<a href=""
    [1]=>
    string(28) "<a class="fancyStyle" href=""
  }
  [1]=>
  array(2) {
    [0]=>
    string(9) "<a href=""
    [1]=>
    string(28) "<a class="fancyStyle" href=""
  }
}

工作代码

您的代码存在一些问题,但是,阻止您获得预期URL的问题是您只是在>之前停止捕获

以下正则表达式将与URL标记的href属性中的a匹配。

#<a\s.*?(?:href=['"](.*?)['"]).*?>#is

说明

  • <a - 匹配a代码
  • 的开头
  • \s.*? - 匹配空白字符,后跟任意字符 0或更多
  • (?: - 创建非捕获组
  • href= - 匹配href=
  • ['"] - 匹配'"
  • (.*?) - 创建一个捕获组并匹配 0或更多字符...
  • ['"] - 匹配'"
  • ) - 结束非捕获组
  • .*?> - 匹配任何字符 0或更多次,然后是>
  • i - 使正则表达式不区分大小写
  • s - 使.匹配所有字符(包括新行)

工作示例

preg_match_all('#<a\s.*?(?:href=[\'"](.*?)[\'"]).*?>#is', $string, $matches);
var_dump($matches);

/**
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(34) "<a href="http://www.google.co.uk">"
    [1]=>
    string(65) "<a class="fancyStyle" href="http://www.youtube.com" id="link136">"
  }
  [1]=>
  array(2) {
    [0]=>
    string(23) "http://www.google.co.uk"
    [1]=>
    string(22) "http://www.youtube.com"
  }
}

*/

示例输入

所有代码都使用以下内容作为preg_match函数...

的输入
$string = <<<EOC
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title of page</title>
    </head>
    <body>
        <h1>Main Page title</h1>
        <p>
            The following is a <a href="http://www.google.co.uk">link to google</a>.
            This is <a class="fancyStyle" href="http://www.youtube.com" id="link136">another link</a>
        </p>
    </body>
    </html>
EOC;