0

我有 3 个不同的字符串:

  1. http://site.com/id-name_of_news.html
  2. http://site.com/category/subcategory/id-name_of_news.html
  3. http://site.com/2008/04/02/name_of_news.html

从每一个我需要得到name_of_news可以包含几乎所有符号的字符串。我认为从.html直到第一个/123-(带有id的斜线)或/02/(日期)开始是明智的,但无法弄清楚如何以更合适的方式做到这一点......可能有人可以帮助我吗?

4

4 回答 4

3

你不需要反过来。您可以构建正则表达式以将该部分放入捕获组中。

您可以使用此正则表达式:

~.*?/(?:\d+-)?([^/]*)\.html~

...并获得第 1 组。

~
  ^
  .*      # match everything
  /       # Till the last `/`
  (?:     # Non-capturing group
     \d+-   # One or more digits followed by a hyphen
  )?      # Optional
  (       # Capture group 1
     [^/.]*  # Match anything except `/` or `.`
  )       
  \.     # Match a dot
  html    # html (at the end)
  $
~
于 2013-10-06T10:45:57.217 回答
0

你真的需要正则表达式吗?您可以使用以下替代方法:

  1. .html使用从末端查找位置$pos = strrpos($url, '.html');
  2. 再次使用/从后面查找最近的pos$slashpos = strrpos($url, '/', $pos * -1);
  3. $url$slashposto开始的子串$pos
于 2013-10-06T10:56:43.293 回答
0
$url = 'http://site.com/id-name_of_news.html';
var_dump(end(explode('/', $url)));

或者

$url = 'http://site.com/id-name_of_news.html';
var_dump(substr($url, strrpos($url, '/')+1));
于 2013-10-06T10:46:44.123 回答
0

你可以试试这个模式:

~http://[^/\s]+/(?:(?:[^/\s]+/){2,3})?(?:id-)?\K[^\s]+(?=\.html)~

这会给你整个模式的结果。

于 2013-10-06T10:53:30.603 回答