【问题标题】:preg_replace with Regex - find number-sequence in URLpreg_replace with Regex - 在 URL 中查找数字序列
【发布时间】:2015-03-11 22:05:01
【问题描述】:

我是一个正则表达式新手,很抱歉这个“简单”的问题:

我有如下网址:

http://stellenanzeige.monster.de/COST-ENGINEER-AUTOMOTIVE-m-w-Job-Mainz-Rheinland-Pfalz-Deutschland-146370543.aspx

我要归档的是使用 preg_replace 在“.aspx”之前获取数字序列(又名 Job-ID)。

我已经发现找到它的正则表达式可能是

(?!.*-).*(?=\.)

现在 preg_replace 需要正则表达式的反义词。我怎样才能存档呢?还值得一提:

网址中可以有多个数字。我只需要“.aspx”之前的序列。此外,“.aspx”后面可能有一些 php 属性,例如“&mobile=true”

感谢您的回答!

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你可以使用:

    $re = '/[^-.]+(?=\.aspx)/i'; 
    preg_match($re, $input, $matches);
    //=> 146370543
    

    这将匹配文本而不是连字符而不是点,然后是 .aspx 使用前瞻 (?=\.aspx)

    RegEx Demo

    【讨论】:

    • 这段代码的效果很好,对 OP 和更多读者的解释会改善你的答案
    • 我已经添加了一个简短的解释。链接的演示有更多关于这个正则表达式的详细信息。
    【解决方案2】:

    您可以只使用preg_match(您不需要preg_replace,因为您不想更改原始字符串)并捕获.aspx之前的数字,它总是在末尾,所以我能想到的最简单的方法是:

    <?php
    $string = "http://stellenanzeige.monster.de/COST-ENGINEER-AUTOMOTIVE-m-w-Job-Mainz-Rheinland-Pfalz-Deutschland-146370543.aspx";
    $regex = '/([0-9]+)\.aspx$/';
    preg_match($regex, $string, $results);
    print $results[1];
    ?>
    

    简短说明:

    $result 包含一个结果数组;因为要搜索的整个字符串是完整的正则表达式,第一个元素包含此匹配项,因此在此示例中为146370543.aspx。第二个元素包含使用 [0-9]+ 周围的括号捕获的组。

    【讨论】:

    • 也很完美。谢谢!
    【解决方案3】:

    你可以使用这个正则表达式得到相反的结果:

    (\D*)\d+(.*)
    

    Working demo

    MATCH 1
    1.  [0-100] `http://stellenanzeige.monster.de/COST-ENGINEER-AUTOMOTIVE-m-w-Job-Mainz-Rheinland-Pfalz-Deutschland-`
    2.  [109-114]   `.aspx`
    

    即使您只想要该网址的数字,您也可以使用此正则表达式:

    (\d+)
    

    【讨论】:

    • 我用 preg_match 代替,但这是 preg_replace 的正确答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多