我对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
?
子串designation-of-the-products-as-slug
是可变的,path / to /可以是任意深度。
第二个想法我意识到没有必要在整个网址路径中使用RegEx: http://path/to/ 可以使用parse_url
,explode
来删除和array_pop
。相应地编辑了我的帖子。
通过削减不可变的尾随子串.html
,也可以减少复杂性。参看@bloodyKnuckles以下评论。发布相应的帖子。
答案 0 :(得分:1)
首先,我要使用parse_url
和pathinfo
的组合来删除字符串中的无关位,然后将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