如何在正则表达式中反向搜索?

时间:2013-10-06 10:39:15

标签: php regex

我有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
  4. 从每一个我需要得到name_of_news字符串,其中几乎可以包含所有符号。我认为从.html到第一个/123-(带有id的斜线)或/02/(日期)是明智的,但是无法弄清楚如何以更恰当的方式做到这一点。可能有人可以帮助我吗?

4 个答案:

答案 0 :(得分: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)
  $
~

答案 1 :(得分: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));

答案 2 :(得分:0)

您可以尝试使用此模式:

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

为您提供整个模式的结果。

答案 3 :(得分:0)

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

  1. 使用.html
  2. 查找$pos = strrpos($url, '.html');的结尾位置
  3. 使用/
  4. 再次从pos后面查找最近的$slashpos = strrpos($url, '/', $pos * -1);
  5. $url开始,将$slashpos的子字符串从$pos