2016-02-17 2 views
0

Я новичок в регулярном выражении и php, но у меня проблема, с которой я не могу справиться в одиночку.Использование backreference wit php preg_match_all

Я подготовил это регулярное выражение, чтобы найти шаблоны, начинающиеся с буквы верхнего регистра. Это может звучит что-то вроде:

  • захвата любого узора, который

  • начинается с один или более прописной буквой

  • затем один или более любая буква или символами в списке

  • затем пробел или знак препинания

  • , и я использую обратную ссылку для установки Я хочу, чтобы те шаблоны в 3 раз:

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

По https://regex101.com/r/pB3nY7/2 работает как яваскрипт регулярных выражений, но не как PHP регулярных выражений.

Я Роде другие сообщения и убедитесь, что:

  • Я использую одинарные кавычки вместо двойных кавычек

  • и я «защищенные» папке \ в моем PHP скрипт:

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

Но он по-прежнему не может соответствовать шаблону, начинающемуся с буквы верхнего регистра.

Заранее спасибо за все советы вы можете предоставить,

С уважением,

Чарльз

+0

В группе PCRE '\ 1' внутри группы 1 все еще не инициализируется, поэтому она терпит неудачу. JS ведет себя по-разному, '\ 1' всегда является пустой строкой, если она не инициализирована. Я думаю, что вам вообще не нужен '\ 1'. См. ['([A-ZÁÀÂÄÈÊËÍÌÎÏÓÒÔÖÚÛÛÜ] {1,} [a-zàáâääçèéêëìíîïðòóôõöùúûüûÿÿ;:« 0-9] {1,} [\ s- ....?,;] {1,3}) '] (https://regex101.com/r/dT1gQ3/1). Разве это не соответствует тому, что вам нужно? –

+0

Спасибо, Виктор. Я хотел воспользоваться возможностью этого регулярного выражения, чтобы узнать, как работают backreference, но ваше решение проще. Спасибо – Charles

+0

Опубликовать как ответ? –

ответ

0

я испытал на этом сайте http://www.phpliveregex.com/:

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

Чтобы быть более универсалом , вы можете использовать свойства 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); 
+0

Спасибо Toto, Я не знаю, как много о regex nore unicode свойства. Это работает с акцентированными персонажами? – Charles

+0

@Charles: Да, это так. Он работает для любого письма на любом языке. Он содержит также несколько букв с диакритикой, которые вы пропустили «ÇŒœ ...». Здесь вы найдете информацию: https://en.wikipedia.org/wiki/Unicode_character_property и http://www.pcre.org/pcre.txt – Toto