正则表达式基于用户名从href属性中提取URL

时间:2019-04-11 09:50:27

标签: php regex

我正在尝试提取来自特定用户之后的所有链接,但是我的正则表达式仅获取一个链接:

HTML:

<div class="from_name">
   USERNAME
</div>
<div class="media_wrap clearfix">
   <div class="media clearfix pull_left media_photo">
      <div class="fill pull_left">
      </div>
      <div class="text">
         <a href="https://google.com</a>
      </div>
   </div>
   <div class="text">
      <a href="https://yahoo.com</a>
   </div>
</div>

代码:

preg_match_all('/USERNAME[\s\S]*?href="(.*?)</', $data, $matches);

print_r($matches);

//输出,仅是caputre google.com:

Array
(
    [0] => Array
        (
            [0] => FullCapture

    [1] => Array
        (
            [0] => https://google.com
        )

)

2 个答案:

答案 0 :(得分:0)

不幸的是,我对电报信使并不熟悉。不,我几乎可以肯定,使用正则表达式无法(轻松)解决您的问题。该规则有太多例外。因此,我将提供2种选择:

  1. 使用适当的HTML解析器,丢弃您不需要的内容,捕获相关信息。

  2. 使用黑客

    • 解析HTML
      • 扔掉所有不会带来相关信息的东西
      • 您最终将获得一个名称和链接列表
    • 如果一个名字后面有另一个名字,请删除它,因为它没有链接;
    • 加载数组中剩余的所有内容,并提供与其专有用户相关的链接。

解析后,您将具有类似于以下内容的结构:

  • 名称
    • 链接
    • 链接
  • 名称<---您将其删除,然后再将数据加载到数组中
  • 名称
    • 链接
  • ...

您可以使用字符串函数甚至正则表达式来进行解析和删除。

答案 1 :(得分:-1)

可以使用两个正则表达式吗?首先将整个区域与USERNAME匹配,然后将其与网址匹配。

preg_match('/(?<=USERNAME).*(?<=href=").*?</s', $string, $matches);

preg_match_all('/(?<=href=").*?(?=<)/', $matches[0], $newMatches);

var_dump($newMatches);

这给您:

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(18) "https://google.com"
    [1]=>
    string(17) "https://yahoo.com"
  }
}