2

这是正则表达式:

"'(\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

4 回答 4

2

使用反向引用:

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

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

于 2013-09-15T17:58:07.050 回答
1

用作\1对您的第一个捕获组的反向引用:

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

在此处查看实际操作:http ://codepad.viper-7.com/2Jw0dL

于 2013-09-15T17:57:40.883 回答
1

您需要使用反向引用:

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

于 2015-01-13T17:27:46.337 回答