正则表达式匹配第一个单词与最后一个单词相同

时间:2013-09-15 17:56:59

标签: php regex preg-match

这是正则表达式:

"'(\d{4})-(.*)-(\d{4})'i"

我希望匹配数字的第一部分(\ d {4}),它必须与最后一部分相同

像这样:

  • 1111-abcdefg-2222 =无效
  • 1111-x-1111 =有效
  • 0000-rwrgreheherhe-0000 =有效
  • 1234-abcd-5678 - 无效

我怎样才能做到这一点?

更新

我使用以下脚本检查输出

$i = '1111-abcd-1111';
preg_match("'(\d{4})-(.*)-(\1)'i",$i,$m);
echo print_r($m,true);

但返回空数组?

4 个答案:

答案 0 :(得分:2)

使用反向引用:

'/(\d{4})-(.*)-\1/i'

\1等于您在第一个捕获组中捕获的内容。

答案 1 :(得分:1)

使用\1作为第一个捕获组的反向引用:

'~(\d{4})-(.*)-\1~'

在此处查看:[{3}}

答案 2 :(得分:1)

您需要使用反向引用:

"'(\d{4})-(.*)-\1'i"

答案 3 :(得分:0)

preg_match("'(\d{4})-(.*)-(\g1)'i",$i,$m);

将\ g1添加到后引用: http://php.net/manual/en/regexp.reference.back-references.php

  

从PHP 5.2.2开始,\ g转义序列可用于子模式的绝对和相对引用。此转义序列后面必须跟无符号数或负数,可选择用大括号括起来。序列\ 1,\ g1和\ g {1}彼此同义。使用带有无符号数字的此模式可以帮助消除在反斜杠后使用数字时固有的模糊性。该序列有助于区分反向引用与八进制字符,并且还使得后引用后跟文字数字更容易,例如, \克{2} 1。