(?P<id>\d*)(/(?P<title>.*))?
大多数情况下,我们使用正则表达式来匹配某些内容,但是如果我们已经id
和title
,那么如何生成匹配的字符串?
示例,如果id=4
和title='hello world'
,则结果应为:
4/hello world
但如果我们只有id=4
,则应该是:
4
因为正如正则表达式所示,title
是可选的。
两个答案都误解了......
还没有preg_match
答案 0 :(得分:1)
您建议如果将正则表达式(?P<id>\d*)(/(?P<title>.*))?
与参数id=4
和title=''
一起传递给函数,函数将返回4
。而且这适用于任何正则表达式。这根本不可能。你的正则表达式就是这样一个函数永远不会支持的例子。
如果使用字符串4
上的正则表达式调用preg_match,则匹配结果将为捕获组4
返回id
,并为捕获组{{1}返回空字符串}}。如果您在字符串title
上使用相同的正则表达式调用preg_match,则捕获组4/
的匹配结果也将为4
,捕获组id
的空字符串也为title
。 PHP不区分匹配空字符串的捕获组和捕获完全不参与正则表达式的组。两者都返回空字符串。请注意,在正则表达式中,您不仅可以使用问号使组成为可选项,捕获组中的.*
也是可选的。
因此,我们有两个可能的匹配4
和4/
,其中preg_match为捕获组4
返回id
,并为捕获组{{1}返回空字符串}}。那么你请求的反向函数如何确定它是否应该为你的两个捕获组返回title
或4
?没有其他信息就无法做到。
事实上,你是否意识到你的正则表达式还匹配4/
以及空字符串?正则表达式中的所有内容都是可选的!
答案 1 :(得分:0)
如何获取原始匹配的字符串 如果我们已经拥有身份和头衔?
原始匹配字符串应该在
中$0
答案 2 :(得分:0)
整个正则表达式匹配始终位于组0
中,因此您可以通过访问索引preg_match()
在0
的匹配数组中获取此匹配项和/或使用$0
或\0
替换preg_replace()
答案 3 :(得分:0)
我不确定我理解这个问题,你的意思是像这样构建字符串吗?
$string = $id;
if ( isset($title) ) {
$string .= "/$title";
}