使用PHP的preg_match函数获取给定可选子字符串之后的一部分字符串

3

我有多个URL,如下所示,这些URL都包含在末尾带有-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

我想要做的是:首先检查URL中是否存在-NS--PD--SP-,然后获取-XX-部分和其后面的部分,例如:e3q3s2wq4q

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

$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
preg_match_all 中使用 -(NS|PD|SP)-(\w+) 正则表达式,并使用两个捕获组。 - anubhava
为什么要使用2个preg_match呢?只需要把第二个放在条件语句里即可。 - chris85
没有必要两次使用 preg_match,可以构建一个带有捕获组的模式来提取所需的信息。 - Casimir et Hippolyte
1
@anubhava 如果(preg_match_all('/-(NS|PD|SP)-(\w+)/', $path, $match)) { print_r($match); } 运行得很好。谢谢。 - YahyaE
1个回答

2

您可以使用

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

或者

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

请查看正则表达式演示

详情:

  • - - 一个减号
  • (NS|PD|SP) - 第一组捕获值之一: NS, PDSP
  • - - 一个减号
  • ([^-/]+) - 1个或多个字符,不包括分隔符-/。如果只有字母和数字,请改用[a-zA-Z0-9]+

PHP演示:

$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);

您的价值观属于第一组和第二组。


Stribizew,它运行得很好,谢谢。有两个问题:这里的一个朋友建议在第二组中使用(\w+)。与您的([^-/]+)有什么区别? - YahyaE
也许还有一个,如果你有时间的话。我们能否在同一个 preg_match 中获取 -NS- 之前的部分? - YahyaE
那部分是可选的吗?如果您的输入与我的代码片段相同,它应该是什么样子?7-pont-with-silver-stripes还是stripes - Wiktor Stribiżew
1
@YahyaE 您可以使用提供的regex101链接来更改正则表达式,并查看它如何与更改一起运行。这是一个带有\w+的更新 https://regex101.com/r/vC2fI1/2。该网站还在右侧提供了每个部分的描述。`\w+`是任何字母字符,数字或下划线。`[^-/]+`是任何非 -- - chris85
@WiktorStribiżew 那部分不是可选的。http://abc.ltd/<group1>-<NS|PD>-<group3> 或者 http://abc.ltd/sth/smw/smo/<last-segment>-<NS|PD>-<group3>。我可以使用两种方式。 - YahyaE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接