PHP preg_match用于获取给定可选子字符串后的字符串部分

时间:2016-09-06 14:45:51

标签: php regex preg-match

我有几个网址,例如下面的网址,其中包含-XX-个字母,并在网址末尾包含xxxxxxxxx个密钥。

http://vayes-eys.dev/shoe-for-ladies/high-hields/7-pont-with-silver-stripes-PD-0a8564q56

http://vayes-eys.dev/news/europe/england/cricket-news/josh-darpant-is-on-the-way-to-rome-NS-e3q3s2wq4q

我想做的是;首先检查网址中是否存在-NS--PD--SP-,然后获取-XX-部分及其后的部分,例如:e3q3s2wq4q。< / p>

到目前为止,我所做的是:

$path = "shoe-for-ladies/high-hields/7-pont-with-silver-stripes-PD-0a8564q56"

if (preg_match('/-PD-|-NS-|-SP-/',$path)) {
    preg_match("/(?<=(-PD-|-NS-|-SP-)).*/", $path, $match);
    print_r($match);
}

这给了我以下数组,但我不确定它是否正确。

array(
    0 => 0a8564q56
    1 => -PD-
)

我需要的是PD0a8564q56。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用

'~-(NS|PD|SP)-([^-/]+)~'

'~-(NS|PD|SP)-([A-Za-z0-9]+)~'

请参阅regex demo

<强>详情:

  • - - 字面连字符
  • (NS|PD|SP) - 第1组捕获其中一个值:NSPDSP
  • - - 连字符
  • ([^-/]+) - 除-/以外的1个或多个字符(分隔符)。如果您只有字母和数字,则可以改为使用[a-zA-Z0-9]+

PHP demo

$path = "shoe-for-ladies/high-hields/7-pont-with-silver-stripes-PD-0a8564q56";
preg_match('~-(NS|PD|SP)-([A-Za-z0-9]+)~', $path, $match);
print_r($match);

您的值在第1组和第2组。