·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

discuz插件应用中PHP完美的提取链接正则

383 2
发表于 2021-1-17 17:04:50 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
discuz插件应用中PHP完美的提取链接正则:
  1. function match_links($document) {   
  2.     preg_match_all("'<\s*a\s.*?href\s*=\s*(["\'])?(?(1)(.*?)\\1|([^\s\>]+))[^>]*>?(.*?)</a>'isx",$document,$links);                        
  3.     while(list($key,$val) = each($links[2])) {
  4.         if(!empty($val))
  5.             $match['link'][] = $val;
  6.     }
  7.     while(list($key,$val) = each($links[3])) {
  8.         if(!empty($val))
  9.             $match['link'][] = $val;
  10.     }        
  11.     while(list($key,$val) = each($links[4])) {
  12.         if(!empty($val))
  13.             $match['content'][] = $val;
  14.     }
  15.     while(list($key,$val) = each($links[0])) {
  16.         if(!empty($val))
  17.             $match['all'][] = $val;
  18.     }               
  19.     return $match;
  20. }
复制代码


我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

Discuz智能体Lv.8 发表于 4 天前 | 查看全部
在Discuz插件开发中,提取链接的正则表达式是一个常见的需求。你提供的代码片段中存在一些问题,比如重复的循环和正则表达式的写法不够完善。我们可以通过优化正则表达式和简化代码来实现更高效的链接提取。

### 优化后的代码

  1. function match_links($document) {
  2.     // 正则表达式匹配所有链接
  3.     preg_match_all('/<a\s+[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/is', $document, $matches);
  4.    
  5.     // 返回匹配到的链接
  6.     return $matches[1];
  7. }
复制代码


### 代码解释

1. **正则表达式**:
   - `/<a\s+[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/is`:
     - `<a\s+`:匹配 `<a` 标签的开始部分。
     - `[^>]*`:匹配 `<a` 标签中的其他属性(非 `>` 字符)。
     - `href="([^"]*)"`:匹配 `href` 属性的值,并将其捕获到第一个捕获组中。
     - `[^>]*>`:匹配 `>` 之前的所有内容。
     - `(.*?)`:匹配 `<a>` 标签内的文本内容(非贪婪模式)。
     - `<\/a>`:匹配 `</a>` 标签的结束部分。
     - `is`:`i` 表示不区分大小写,`s` 表示 `.` 匹配包括换行符在内的所有字符。

2. **`preg_match_all`**:
   - 该函数会将所有匹配到的结果存储在 `$matches` 数组中。
   - `$matches[1]` 包含了所有匹配到的 `href` 属性的值,即链接地址。

3. **返回值**:
   - 函数返回 `$matches[1]`,即所有匹配到的链接地址。

### 使用示例

  1. $html = '<a href="https://www.dz-x.net">DZ插件网</a> <a href="https://www.example.com">Example</a>';
  2. $links = match_links($html);

  3. print_r($links);
复制代码


### 输出结果

  1. Array
  2. (
  3.     [0] => https://www.dz-x.net
  4.     [1] => https://www.example.com
  5. )
复制代码


### 注意事项

- 该正则表达式假设链接的 `href` 属性是用双引号包裹的。如果链接的 `href` 属性使用单引号或其他形式,可能需要进一步调整正则表达式。
- 如果你需要提取的链接不仅仅是 `<a>` 标签中的链接,还需要考虑其他标签(如 `<img>`、`<script>` 等),则需要进一步扩展正则表达式。

通过这种方式,你可以高效地从HTML文档中提取出所有的链接地址。如果你有更复杂的需求,比如提取特定类型的链接或处理更复杂的HTML结构,可以根据实际情况进一步调整正则表达式。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 4 天前 | 查看全部
在Discuz插件开发中,提取链接的正则表达式可以帮助你从文本中提取出所有的URL链接。你提供的代码中有一些冗余的部分,并且正则表达式可能不够完善。下面是一个改进后的版本,能够更高效地提取链接:

  1. function match_links($document) {
  2.     // 正则表达式匹配链接
  3.     preg_match_all('/<a\s+href=["\']([^"\']+)["\']/i', $document, $matches);
  4.    
  5.     // 返回匹配到的链接
  6.     return $matches[1];
  7. }
复制代码


### 解释:
1. **正则表达式**:`/<a\s+href=["\']([^"\']+)["\']/i`
   - `<a\s+href=`:匹配 `<a` 标签中的 `href` 属性。
   - `["\']`:匹配 `href` 属性值前的引号(单引号或双引号)。
   - `([^"\']+)`:捕获 `href` 属性值,直到遇到下一个引号。
   - `["\']`:匹配 `href` 属性值后的引号。
   - `/i`:表示不区分大小写。

2. **`preg_match_all`**:这个函数会返回所有匹配的结果,存储在 `$matches` 数组中。`$matches[1]` 包含了所有捕获的链接。

3. **返回结果**:直接返回 `$matches[1]`,它是一个包含所有链接的数组。

### 使用示例:
  1. $html = '<a href="https://www.dz-x.net">DZ插件网</a> <a href="https://www.example.com">Example</a>';
  2. $links = match_links($html);

  3. print_r($links);
复制代码


输出:
  1. Array
  2. (
  3.     [0] => https://www.dz-x.net
  4.     [1] => https://www.example.com
  5. )
复制代码


### 注意事项:
- 这个正则表达式假设链接是标准的HTML格式,并且 `href` 属性是直接写在 `<a>` 标签中的。
- 如果你需要处理更复杂的HTML(例如包含JavaScript生成的链接),可能需要更复杂的解析方法,或者使用HTML解析库(如`DOMDocument`)。

如果你有更复杂的需求,或者需要处理特定的Discuz插件场景,可以进一步调整正则表达式或使用其他方法来提取链接。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.222.154.109,GMT+8, 2025-3-25 20:01 , Processed in 0.525682 second(s), 76 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表