如何使用正则表达式获取以下类型的网址

时间:2016-06-02 06:55:40

标签: php regex

$string1 = "/8-a-plastic-surgery-timeline-and-how-he-would-have-looked-like-without/70/1";
$string2 = "/48/88-mindbending-pictures-that-will-make-you-question-what-you-see/12";
$string3 = "/90-the-sleeping-position-of-women-reveal-a-lot-about-them/77";
  

从$ string1开始,我想 70

     

从$ string2,我想 48

     

从$ string3开始,我想 77

我尝试过以下代码:

preg_match("/(\/([0-9]+)\/*)([^\-]$)/", $string2, $matches);

但它没有给我一篇关于所有字符串的文章的ID,我非常接近它,但却无法获得完美的文章。

请帮我解决这个问题。提前致谢

3 个答案:

答案 0 :(得分:1)

这是一个基本的解决方案。

正则表达式:(?<=\/)(\d+?)(?=\/)|(?<=[A-z]{4}\/)(\d+)

DEMO

如果三个链接有一定的统一性会有所帮助,但如果你只需要一个权宜之计的解决方案,那么现在就足够了。

答案 1 :(得分:0)

我不确定另一个答案的正则表达式是否也会处理其他情况。

猜测您提供的网址中ID的逻辑是:

“id是第一个网址部分,只是一个数字。”

考虑到这一点,您可以使用此功能:

// returns -1 if no id is found
function getID($str)
{
    $arr = explode("/",$str);

    foreach($arr as $element)
    {
        if(!empty($element) && ((string)intval($element)==$element))
        {
            return $element;
        }
    }
    return -1;
}

在此处查看此操作:https://3v4l.org/rcTl6

它输出所需的结果:

70
48
77
142

P.S。而且,没有使用正则表达式。所以no extra problems:D

答案 2 :(得分:0)

正则表达式没有任何问题。只需要纠正它。

preg_match("/(\d+)\/\d+$|\/(\d+)\/\d+|\/(\d+)$/", $str, $output);

演示:
http://www.phpliveregex.com/p/fTe