Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_match用于在给定可选子字符串之后获取字符串部分_Php_Regex_Preg Match - Fatal编程技术网

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

PHP preg_match用于在给定可选子字符串之后获取字符串部分,php,regex,preg-match,Php,Regex,Preg Match,我有几个url,比如下面的url,其中包含-XX-字母和url末尾的xxxxxxxx键 http://vayes-eys.dev/shoe-for-ladies/high-hields/7-pont-with-silver-stripes-PD-0a8564q56 或 我想做的是;首先检查url中是否存在-NS-、-PD-或-SP-,然后获取-XX-部分及其后面的部分,例如:e3q3s2wq4q 到目前为止,我所做的是: $path = "shoe-for-ladies/high-hields

我有几个url,比如下面的url,其中包含
-XX-
字母和url末尾的
xxxxxxxx

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

我想做的是;首先检查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);
}
我需要的是
PD
0a8564q56
。谢谢您的帮助。

您可以使用

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

详细信息

  • -
    -文字连字符
  • (NS | PD | SP)
    -第1组捕获以下值之一:
    NS
    PD
    SP
  • -
    -连字符
  • ([^-/]+)
    -1个或多个字符,而不是
    -
    /
    (分隔符)。如果只有字母和数字,可以使用
    [a-zA-Z0-9]+
:


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

preg\u match\u all中使用
使用两个捕获的组。为什么2
preg\u match
s。只需将第二个放在条件中。不需要使用两次
preg_match
,用捕获组构建一个模式来提取所需信息。@anubhava
if(preg_match_all('/-(NS | PD | SP)-(w+/,$path,$match)){print_r($match)}
工作得很好。谢谢,斯特里比索,我工作得很好,谢谢。两个问题:这里的一位朋友建议第二组使用
(\w+)
。你的
([^-/]+)
有什么不同。如果你有时间的话,也许再多一个。我们能在同一场预赛中得到前-NS-部分吗?那部分是可选的吗?如果在我的代码段中有输入,它应该是什么样子
7-pont-with-silver-stripes
stripes
?@YahyaE您可以使用regex101提供的链接更改regex,并查看它如何在更改中运行。以下是
\w+
的更新。该网站还提供了右侧各部分的说明<代码>\w+
是任何字母字符、数字或分数以下的字符
[^-/]+
是任何非
-
-
@WiktorStribiżew,该部分不是可选的<代码>http://abc.ltd/--
http://abc.ltd/sth/smw/smo/--
。两者我都可以用。
array(
    0 => 0a8564q56
    1 => -PD-
)
'~-(NS|PD|SP)-([^-/]+)~'
'~-(NS|PD|SP)-([A-Za-z0-9]+)~'
$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);