【问题标题】:Using backreference wit php preg_match_all在 php preg_match_all 中使用反向引用
【发布时间】:2016-02-17 13:09:53
【问题描述】:

我是 regex 和 php 的新手,但我面临一个我无法单独处理的问题。

我准备了这个正则表达式来查找以大写字母开头的模式。听起来可能是这样的:

  • 捕获任何模式

  • 以一个或多个大写字母开头

  • 然后是列表中的一个或多个任意字母或字符

  • 然后是空格或标点符号

  • 我使用反向引用来设置我想要这些模式最多 3 次:

    ([A-ZÁÀÂÄÉÈÊËÍÌÎÏÓÒÔÖÚÙÛÜ]{1,}[a-zàáâãäåçèéêëìíîïðòóôõöùúûüýÿ;:«0-9]{1,}[\s-….?,;]\1{1,3})
    

根据https://regex101.com/r/pB3nY7/2,它可以用作 javascript 正则表达式,但不能用作 php 正则表达式。

我已经评价了其他帖子并确保:

  • 我用单引号代替双引号

  • 我在我的 php 脚本中“保护”了 \:

    '#([A-ZÁÀÂÄÉÈÊËÍÌÎÏÓÒÔÖÚÙÛÜ]{1,}[a-zàáâãäåçèéêëìíîïðòóôõöùúûüýÿ;:«0-9]{1,}[\\s-….?,;]\\1{1,3})#'
    

但它仍然无法匹配任何以大写字母开头的模式。

提前感谢您提供的所有建议,

问候,

查尔斯

【问题讨论】:

标签: php regex backreference


【解决方案1】:

我已经在这个网站上测试过http://www.phpliveregex.com/

(^[A-ZÁÀÂÄÉÈÊËÍÌÎÏÓÒÔÖÚÙÛÜ]{1,}[a-zàáâãäåçèéêëìíîïðòóôõöùúûüýÿ;:«0-9]{1,}[\s-….?,;]{1,1}){1,3}

【讨论】:

    【解决方案2】:

    为了更通才,您可以使用 unicode 属性:

    ^(\p[Lu}+[\p{Ll};:«0-9]+[\s\p{P}]){1,3}
    

    \p[Lu} 代表大写字母,\p{Ll} 代表小写字母,\p{P} 代表标点符号。

    preg_match('/^(\p[Lu}+[\p{Ll};:«0-9]+[\s\p{P}]){1,3}/', $string, $match);
    

    【讨论】:

    • 感谢 Toto,我对 regex nore unicode 属性了解不多。它适用于重音字符吗?
    • @Charles:是的。它适用于任何语言的任何字母。它还包含一些您错过的带有变音符号的字母ÇŒœ...。您可以在这里找到信息:en.wikipedia.org/wiki/Unicode_character_propertypcre.org/pcre.txt
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多