2016-02-20 2 views
2

Может ли кто-нибудь помочь мне, как к определенному шаблону для функции preg_match?PHP регулярное выражение: каждое слово должно заканчиваться точкой

  • Каждое слово в строке должно заканчиваться точкой
  • Первый символ строки должен быть [A-Za-Z]
  • После каждой точки может быть пространство
  • Там не может быть два пространства рядом друг с другом
  • Последний символ должен быть точка (logicaly после слова)

Примеры:

  • "Ing" -> false
  • "Ing." -> true
  • ".". -> false
  • "Xx Yy." -> false
  • "XX. YY." -> true
  • "XX.YY." -> true

Можете ли вы мне помочь, пожалуйста, как проверить строку? Мой рисунок

/^(([a-zA-Z]+)(?!) \.)+\.$/ 

Я знаю, что это неправильно, но я не могу это понять. Благодаря

+1

Regex не хорошо для повторяющегося проверки.Единственное, что вы можете сделать, это совпадение с каждым совпадающим словом, а затем с кодом также подсчитывать (простые) слова и видеть, совпадает ли подсчет регулярного выражения с совпадающим кодом. Удачи. –

ответ

0

Попробуйте это:

$string = "Ing 
Ing. 
.Ing. 
Xx Yy. 
XX. YY. 
XX.YY."; 

if (preg_match('/^([A-Za-z]{1,}\.[ ]{0,})*/m', $string)) { 
    // Successful match 
} else { 
    // Match attempt failed 
} 

Результат:

enter image description here

The Regex подробно:

^    Assert position at the beginning of a line (at beginning of the string or after a line break character) 
(    Match the regular expression below and capture its match into backreference number 1 
    [A-Za-z]  Match a single character present in the list below 
         A character in the range between “A” and “Z” 
         A character in the range between “a” and “z” 
     {1,}   Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
    \.    Match the character “.” literally 
    [ ]    Match the character “ ” 
     {0,}   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
)*    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
2

Проверьте, как это соответствует вашим потребностям.

/^(?:[A-Z]+\. ?)+$/i 
  • ^ матчей начинают
  • (?: открывает non-capture group для повторения
  • [A-Z]+ с iflag соответствует одному или более альфа (нижняя & верхних)
  • \. ? соответствует символу точка, за которой следует необязательный пробел
  • все это один или несколько раз до конца $

Here's a demo at regex101

Если вы хотите запретить пространство в конце, добавить отрицательный look позади: /^(?:[A-Z]+\. ?)+$(?<!)/i

+0

Отлично! Я пытался понять это, но тоже. Я боролся с «Не может быть двух мест рядом друг с другом», потому что я не видел шаблон повторения на нем. Однако есть одна незначительная вещь, вы должны сказать, что флаг 'i' делает регистр регулярным регистром нечувствительным. +1 за ваш ответ! замечательно! –

+0

@JorgeCampos Добро пожаловать, да, я упоминаю с флагом i, он соответствует одному или нескольким альфам, где я имею в виду нижний и верхний: D обновлен. –

+0

Что делать, если в строке есть знаки или цифры пунктуации? –

Смежные вопросы