PHP preg_match Улучшение регулярных выражений - PullRequest
1 голос
/ 07 декабря 2011

Привет всем ,

Я пытаюсь расширить область действия preg_match , который я сейчас использую в чате.Я изо всех сил пытаюсь использовать свое текущее регулярное выражение, чтобы получить желаемую идентификацию.Пожалуйста, посмотрите текущее регулярное выражение, которое я использую, а затем некоторую информацию о совпадениях, которые я бы хотел достичь.


Текущее регулярное выражение:

~\bf+(?:\.+|\s+)?r+(?:\.+|\s+)?e+(?:\.+|\s+)?d+(?:\.+|)?\b~i

Информация о желаемом матче:

[01] Lorem ipsum dolor Фред Сит Амет.

  • Определитьключевое слово .

[02] Lorem ipsum dolor $ fred sit amet.

  • Определить символ доллара и ключслово.

[03] Lorem ipsum dolor $ ofred sit amet.

  • Укажите один символ доллара, за которым следует символодин буквенно-цифровой символ и ключевое слово.

[04] Lorem ipsum dolor $ ooofred sit amet.

  • Определить одинсимвол доллара, за которым следуют несколько буквенно-цифровых символов и ключевое слово.

[05] Lorem ipsum dolor $$$ ooofred sit amet.

  • Определить несколько символов доллараза ними следуют несколько буквенно-цифровых символов и ключевое слово.

[06] Lorem ipsum dolor $$$ ofred sit amet.

  • Идентифицируйте несколько долларовых символов, за которыми следует один буквенно-цифровой символ и ключевое слово.

[07] Lorem ipsum dolor $ o $ oo $$$ ofred sitamet.

  • Укажите любую комбинацию символов доллара и буквенно-цифровых символов, за которыми следует ключевое слово.

[08] Lorem ipsum dolor $ o $ oo $$$ ofred sit amet.

  • Пробелы нарушают идентификацию

[09] $ ofred sit amet.

  • Идентифицировано без начальных пробелов

[10] Lorem ipsum dolor $ ofred

  • Идентифицирован без пробелов

[11] Lorem ipsum dolor $ ofred !

  • Идентифицируется с помощью висячих символов

Спасибо за любую помощь, она очень ценится.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Это должно быть самое длинное объяснение, которое я когда-либо видел, для такого маленького регулярного выражения:

if (preg_match('/(?<=^|\s)(?:\bfred\b|\$[$\w]*fred\b)/x', $subject, $regs)) {
    $result = $regs[0];
}

Объяснение:

"
(?<=           # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
               # Match either the regular expression below (attempting the next alternative only if this one fails)
      ^        # Assert position at the beginning of the string
   |           # Or match regular expression number 2 below (the entire group fails if this one fails to match)
      \s       # Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
)
(?:            # Match the regular expression below
               # Match either the regular expression below (attempting the next alternative only if this one fails)
      \b       # Assert position at a word boundary
      fred     # Match the characters “fred” literally
      \b       # Assert position at a word boundary
   |           # Or match regular expression number 2 below (the entire group fails if this one fails to match)
      \$       # Match the character “$” literally
      [$\w]    # Match a single character present in the list below
               # The character “$”
               # A word character (letters, digits, etc.)
         *     # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
      fred     # Match the characters “fred” literally
      \b       # Assert position at a word boundary
)
"
1 голос
/ 07 декабря 2011
/((\$[\w\$]*)?fred)/

Что не так с этим регулярным выражением?

Я не уверен, что понимаю значение:

(?:\.+|\s+)

В вашем регулярном выражении.

...