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


Regex match first word same as last word

这是正则表达式:

"'('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);

但是返回空数组?

使用反向引用:

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

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

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

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

在这里看到它的实际效果:http://codepad.viper-7.com/2Jw0dL

你需要使用反向引用:

"'('d{4})-(.*)-'1'i"
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} 是彼此同义的。将此模式与无符号数字一起使用有助于消除在反斜杠后使用数字时固有的歧义。该序列有助于区分反向引用和八进制字符,并且还更容易使反向引用后跟文字数字,例如 ''g{2}1。