【问题标题】:preg_match to find links to images and urlpreg_match 查找图像和 url 的链接
【发布时间】:2013-09-19 23:17:07
【问题描述】:

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

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

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

【问题讨论】:

标签: php preg-match


【解决方案1】:

您的代码

$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,以便您可以获得所有@的列表987654328@ 来自输入。

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

正则表达式

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

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

这一切都意味着,针对 示例输入,您的正则表达式将匹配第一个链接示例 (google) 中的 &lt;a href=" 和第二个链接示例 (youtube) 中的 &lt;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 的原因是您只是在到达它之前停止捕获。

以下正则表达式将匹配a 标记的href 属性内的URLs。

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

说明

  • &lt;a - 匹配 a 标签的开头
  • \s.*? - 匹配空格字符后跟任何字符0次或更多
  • (?: - 创建一个非捕获组
  • href= - 匹配 href=
  • ['"] - 匹配 '"
  • (.*?) - 创建一个捕获组并匹配 0 个或更多 个字符之前...
  • ['"] - 匹配 '"
  • ) - 结束非捕获组
  • .*?&gt; - 匹配任意字符0 次或更多 次,后跟&gt;
  • 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;

【讨论】:

  • 哇,谢谢史蒂文。你的解释很透彻。我会试试这个,让你知道。我想知道您是否可以向我指出您了解正则表达式的资源。我想阅读它,以便更好地理解它。
  • regular-expressions.info - 这是一个很好的参考,点击顶部的“教程”,你会发现从基本的字符类[]到更高级的东西,比如@987654377 @等
  • @Steven 谢谢你的解释!!
猜你喜欢
  • 2011-10-08
  • 2015-12-03
  • 2021-12-05
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多