regex / preg_replace提取部件号(子串)

时间:2015-03-15 15:40:00

标签: php regex preg-replace

我对RegEx不太满意。


用例

我使用三个变量,即$url$pattern$replacement,并打算按如下方式使用它们:

$url = $node->attr("href");

$resource = ExtractResourceWithoutHtmlExtension($url); // This is jus to abstract the stripping off of the prepended path and cutting the `.html` (see Edit 2 & 3 below).

$pattern =  ...
$replacement = ${1}; // Not very sure of this value

$partno = preg_replace($pattern, replacement, $resource);

echo '"'.$partno.'";"'.$node->attr("title").'";"'.$url.'"'."\n";

零件号和资源方案映射(字符串)

  • 大部分时间

35000-0295 =>指定的最产品-AS-slug-的 35000-0295

27021-0012 =>指定的最产品-AS-slug-的 27021-0012

  • 或很少

38811 =>指定的最产品-AS-slug-的 38811

  • 最后但并非最不重要(边缘情况=>无需提取)

  • 如果部件号不可用,资源子字符串将只是

designation-of-the-products-as-slug

我仍然更喜欢RegEx解决方案,因为构成部件号的段内的数字长度可能会有所不同。


问题

我应该将哪些内容分配给$pattern$replacement


编辑1(供参考)

子串designation-of-the-products-as-slug是可变的,path / to /可以是任意深度

编辑2(供参考)

第二个想法我意识到没有必要在整个网址路径中使用RegEx: http://path/to/ 可以使用parse_urlexplode来删除和array_pop。相应地编辑了我的帖子。

编辑3(供参考)

通过削减不可变的尾随子串.html,也可以减少复杂性。参看@bloodyKnuckles以下评论。发布相应的帖子。

1 个答案:

答案 0 :(得分:1)

首先,我要使用parse_urlpathinfo的组合来删除字符串中的无关位,然后将preg_filter/.*?(\d+[\d-]*)$/这样的正则表达式一起使用抓住最后一块数字加上可选的连字符和数字。


实施例

$urls = [
    "http://example.com/path/to/designation-of-the-products-as-slug-35000-0295.extension",
    "http://example.com/path/to/designation-of-the-products-as-slug-35000.html",
    "http://example.com/path/to/designation-of-the-products-as-slug.ext?foo=bar.baz"
];

$regex = '/.*?(\d+[\d-]*)$/';

foreach ($urls as $url) {
    $resource = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_FILENAME);
    echo preg_filter($regex, '$1', $resource), "\n";
}

输出:

35000-0295
35000