【问题标题】:PHP Matching URLs and using preg_replace_callback()PHP 匹配 URL 和使用 preg_replace_callback()
【发布时间】:2013-03-17 01:41:17
【问题描述】:

我使用以下内容查找 $content 中的所有 URL

 $content = preg_match_all( '/(http[s]?:[^\s]*)/i', $content, $links );

但这将取决于http://www.google.com/some/path 中的http:// 部分。

我的问题是:

1 - 我怎样才能修改它以点击仅以 www 开头的链接,例如www.google.com?

2 - 主要目的是找到链接,并将它们替换为从另一个函数返回的值。我试过 preg_match_callback() ,但它不起作用(可能使用错误..

$content = preg_replace_callback(
           "/(http[s]?:[^\s]*)/i",
            "my_callback",
            $content);

function my_callback(){

// do a lot of stuff independently of preg_replace
// adding to =.output...

return $output;
}

现在,按照我的逻辑(这可能是错误的),来自$content 的所有匹配项都将被$output 替换。我做错了什么?

(请不要使用匿名函数 - 我正在旧服务器上测试)

编辑我 - 在 cmets 之后,试图澄清更多细节

function o99_simple_parse($content){

$content = preg_replace_callback( '/(http[s]?:[^\s]*)/i', 'o99_simple_callback', $content );


return $content;
}

回调:

function o99_simple_callback($url){
    // how to get the URL which is actually the match? and width ??
        $url = esc_url_raw( $link );
        $url_name = parse_url($url); 
        $url_name = $description = $url_name['host'];// get rid of http://..
        $url = 'http://something' .  urlencode($url)   . '?w=' . $width ; 
        return $url; // what i really need to replace 
    }

【问题讨论】:

  • 检查这个:stackoverflow.com/questions/1755144/…,尤其是魔术贴的回应。
  • 谢谢,但它忽略了 HTTP 和 HTTPS 网址? .此外,没有关于回调的信息。基本上它是连接 2 个正则表达式,不是吗?

标签: php regex preg-replace preg-replace-callback


【解决方案1】:

要修改您已经必须允许以 www 开头的 URL 的正则表达式,您只需这样写:

/((http[s]?:|www[.])[^\s]*)/i
  +         ++++++++

【讨论】:

  • 谢谢!我会检查一下……回调的第二部分呢?我用错了吗?
  • 我不确定,因为您没有包含您的代码。 my_callback 应该接受一个参数,例如:my_callback($matches),并且您将使用 $matches 中的项目来构造您的输出。
  • 您似乎误解了回调机制。无论您定义什么回调,PHP 的 internals 都会传递参数。无论你name参数$matches还是$url都没有关系,但在preg_replace_callback的情况下,PHP的内部将传递一个单个参数:一个array 捕获组。在您的代码中,在o99_simple_callback 中,您调用此数组$url 并对其进行操作,就好像它是一个字符串一样,但这是不正确的。您要查找的 URL 实际上位于 $url[0](以及 $url[1])中。
  • 谢谢!这澄清了一些(+1)..但我认为回调的工作方式是每个“命中”或匹配将转到回调然后返回函数。否则我看不出只使用 preg_match_all() 和 preg_replace_callback() 之间的区别.. 但无论如何它可能是另一个问题的东西.. 感谢您的帮助..
猜你喜欢
  • 2019-03-25
  • 2012-08-20
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2021-01-26
  • 1970-01-01
  • 2017-05-06
相关资源
最近更新 更多