preg_match网址的一部分

时间:2013-04-27 06:59:50

标签: regex preg-replace preg-match

我的链接看起来像http://site.com/numbers_and_letters/This_is_what-I-need_to-retrieve.html

我基本上需要检索这部分:This_is_what-I-need_to-retrieve 并且还用空格替换破折号和下划线,以便最终看起来像这样:This is what I need to retrieve

我是regex的新手,所以这就是我正在使用的: (虽然有效,但表现不佳)

function clean($url)
{
    $cleaned = preg_replace("/http:\/\/site.com\/.+\//", '', $url);
    $cleaned = preg_replace("/[-_]/", ' ', $cleaned);
    //remove the html extension
    $cleaned = substr($cleaned, 0,-4);  
    return $cleaned;
}

1 个答案:

答案 0 :(得分:1)

你所得到的并不是那么糟糕。但也许您可以尝试将其性能与此进行比较:

preg_match('[^/]+$', $url, $match);
$cleaned = preg_replace('[-_]', ' ', $match);

修改

  

如果你拥有的只是一把锤子,那么一切看起来都像钉子。

如何完全避免正则表达式? (我假设每个输入都是有效的URL。)

$cleaned = strtr(substr($url, strrpos($url, '/') + 1, -5), '-_', '  ');

这甚至删除了.html扩展名! (我做了你似乎已经做出的所有假设,即。所有链接都以.html结尾。)简要说明:

  • strtr 将一组字符例如 -_翻译成另一组中的相应字符,例如空间。 (我认为它比调用整个正则表达式引擎更有效。)
  • substr,您必须知道,但请注意,如果最后一个参数为负数,例如 -5,则表示从结尾到的字符数忽略。对于这种情况很方便,而且可能比正则表达式更有效。
  • 当然,
  • strrpos会找到字符串中字符的最后位置,例如 /