【问题标题】:Extract all urls/domains from any string in php从 php 中的任何字符串中提取所有 url/域
【发布时间】:2014-02-20 04:37:44
【问题描述】:

我使用 php 并从文本框中获取以下文本字符串。

这是一个字符串我有:

header1            header2             edit
b-1246431          12.01.13            1246431  |  blog.domain.net            1232,00 ‌‌
details
b-1312231          12.01.13            1246431  |  blog.domain.co.uk          12312,00
b-2344311          12.01.13            1246431  |  www.domain.com/             9129,00 ‌‌
b-2344322          12.01.13            1246431  |  http://abc.de              1332,00 ‌‌
b-2344322          13.01.13            1246431  |  www.cdf.de/                 21140,00             ‌‌edit
b-1233422          06.01.13            1246431  |  www.dto.de/site1      21110,00
b-1233542          06.01.13            1246431  |  www.ghj.ca/site2.html      28110,00             ‌‌             edit
b-1231242          06.01.13            1246431  |  www.another.de            2101,00             ‌‌
b-1231231          04.01.13            1246431  |  onlyme.info/  

我想要这个输出

blog.domain.net
blog.domain.co.uk
www.domain.com/
http://abc.de
www.cdf.de/
www.dto.de/site1
www.ghj.ca/site2.html
www.another.de
onlyme.info/  

字符串会改变。我总是需要只需要提取的网址。 问题可能是:有时 url 以 www、http 开头,或者两者都没有。仍然应该将它们视为 url。

我已经查过这些帖子: extracting one or more urls from a string in php http://daringfireball.net/2010/07/improved_regex_for_matching_urls

...但我的文本字符串没有任何效果...

【问题讨论】:

  • 看起来很有条理。为什么不用| 和一个空格爆炸两次?
  • 每个字符串都会不同。下一个字符串可能没有'|' ...
  • 当你没有|时,它会被任何其他分隔符替换吗?如果是,您可以按空格分割字符串,然后从结果中检索第 5 列,因为 URL 将位于第 5 位。此外,URL 是否始终是字符串格式而不是 IP?如果 URL 之前的所有内容都是数字,这也有帮助。

标签: php regex url


【解决方案1】:

用正则表达式试试:

<?php
$input = "header1            header2             edit
b-1246431          12.01.13            1246431  |  blog.domain.net            1232,00 ‌‌
details
b-1312231          12.01.13            1246431  |  blog.domain.co.uk          12312,00
b-2344311          12.01.13            1246431  |  www.domain.com/             9129,00 ‌‌
b-2344322          12.01.13            1246431  |  http://abc.de              1332,00 ‌‌
b-2344322          13.01.13            1246431  |  www.cdf.de/                 21140,00             ‌‌edit
b-1233422          06.01.13            1246431  |  www.dto.de/site1      21110,00
b-1233542          06.01.13            1246431  |  www.ghj.ca/site2.html      28110,00             ‌‌             edit
b-1231242          06.01.13            1246431  |  www.another.de            2101,00             ‌‌
b-1231231          04.01.13            1246431  |  onlyme.info/";

preg_match_all('#[-a-zA-Z0-9@:%_\+.~\#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~\#?&//=]*)?#si', $input, $result);

foreach ($result[0] as $url)
{
    echo $url . "<br />\n";
}

或者在这里查看我的 PHPFiddle:PHPFiddle

【讨论】:

    【解决方案2】:

    试试这个

    $lines = explode("\n", $s);
    foreach ($lines as $line) {
        if (strpos($line, "|") !== false) {
            $url = trim(explode(" ", trim(explode('|', $line)[1]))[0]);
            echo $url."<BR>";
        }
    }
    

    适用于 php 5.4+

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2015-08-03
      • 2011-01-18
      • 2021-08-19
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多