如何在PHP中基于正则表达式和相关参数构造字符串?

时间:2010-03-10 17:09:48

标签: php regex

(?P<id>\d*)(/(?P<title>.*))?

大多数情况下,我们使用正则表达式来匹配某些内容,但是如果我们已经idtitle,那么如何生成匹配的字符串?

示例,如果id=4title='hello world',则结果应为:

4/hello world

但如果我们只有id=4,则应该是:

4

因为正如正则表达式所示,title是可选的。

两个答案都误解了......

还没有preg_match

4 个答案:

答案 0 :(得分:1)

您建议如果将正则表达式(?P<id>\d*)(/(?P<title>.*))?与参数id=4title=''一起传递给函数,函数将返回4。而且这适用于任何正则表达式。这根本不可能。你的正则表达式就是这样一个函数永远不会支持的例子。

如果使用字符串4上的正则表达式调用preg_match,则匹配结果将为捕获组4返回id,并为捕获组{{1}返回空字符串}}。如果您在字符串title上使用相同的正则表达式调用preg_match,则捕获组4/的匹配结果也将为4,捕获组id的空字符串也为title 。 PHP不区分匹配空字符串的捕获组和捕获完全不参与正则表达式的组。两者都返回空字符串。请注意,在正则表达式中,您不仅可以使用问号使组成为可选项,捕获组中的.*也是可选的。

因此,我们有两个可能的匹配44/,其中preg_match为捕获组4返回id,并为捕获组{{1}返回空字符串}}。那么你请求的反向函数如何确定它是否应该为你的两个捕获组返回title4?没有其他信息就无法做到。

事实上,你是否意识到你的正则表达式还匹配4/以及空字符串?正则表达式中的所有内容都是可选的!

答案 1 :(得分:0)

  

如何获取原始匹配的字符串   如果我们已经拥有身份和头衔?

原始匹配字符串应该在

$0

答案 2 :(得分:0)

整个正则表达式匹配始终位于组0中,因此您可以通过访问索引preg_match()0匹配数组中获取此匹配项和/或使用$0\0替换preg_replace()

答案 3 :(得分:0)

我不确定我理解这个问题,你的意思是像这样构建字符串吗?

$string = $id;
if ( isset($title) ) {
    $string .= "/$title";
}