2016-08-22 2 views
1

Я хотел бы проверить, если строка "geb." или «geb» был введен в поле. Я близок к разгадке, но этот период вызывает проблемы для меня:Определите, если строка "geb." был введен

<input type="text" name="Name" size="25" 
    title="Hier nur Vor- und Nachnamen in dieser Reihenfolge eingeben (bitte ohne Zusatz des Geburtsnamens!)." 
    value="Eva Gebhard geb. Zander" 
    onchange="if (Name.value.toUpperCase().search(' GEB[. ]') > -1) {alert('Die Angabe des Geburtsnamens ist nicht erforderlich. Bitte weglassen!'); setFocus(this); return false};" /> 

Я создал скрипку, чтобы проверить: https://jsfiddle.net/spade/3rv2s3sc/ , но не мог понять.

Может кто-нибудь, пожалуйста, протяните мне руку?

Заранее спасибо.

+0

Это просто '' ГЭБ анализа захвата буфера 1 для точки или пространства ([.]). – sln

+0

Просто fyi, ваше регулярное выражение имеет пространство перед GEB, так что это то, что он ищет. И JS не нужно, чтобы регулярное выражение находилось в разделителях '/.../'? – sln

+0

Не используйте 'search' со строками, передайте регулярное выражение! – Bergi

ответ

0

Вы используете в обработчике, который является неопределенным переменной Name. Вам необходимо протестировать, используя this, который является элементом ввода в контексте обработчика. Кроме того, если вы не определили его в другом месте, setFocus() не является функцией. Используйте this.focus(), чтобы сбросить фокус (хотя я предполагаю, что вы просто делаете это по причинам тестирования).

Вам не нужно использовать /.../, чтобы указать регулярное выражение для функции поиска Javscript. JS search автоматически преобразует строку в регулярное выражение. Тем не менее, точка Barmar с использованием match вместо search является хорошей для вашего случая, так как вам не нужен индекс, в котором встречается совпадение в строке, только независимо от того, есть ли строка в любом месте.

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

Чтобы показать, почему ваш код не работает, здесь работает модификация, сохраняя, как большая часть его так же, как это возможно, так что вы можете понять свои ошибки

<input type="text" name="Name" size="25" title="Hier nur Vor- und Nachnamen in dieser Reihenfolge eingeben (bitte ohne Zusatz des Geburtsnamens!)." value="Eva Gebhard geb. Zander" 
    onchange="if (this.value.toUpperCase().search(' GEB[. ]') > -1) {alert('Die Angabe des Geburtsnamens ist nicht erforderlich. Bitte weglassen!'); this.focus(); return false};" /> 

Вот еще один пример, показывающий некоторые из комментарии других пользователей включены:

function myFunction(el) { 
 
    value = el.value; 
 
    if (value.match(/geb[. ]/i)) { 
 
    alert('Die Angabe des Geburtsnamens ist nicht erforderlich. Bitte weglassen!'); 
 
    el.focus(); 
 
    return false; 
 
    } 
 
}
<input type="text" name="Name" size="25" title="Hier nur Vor- und Nachnamen in dieser Reihenfolge eingeben (bitte ohne Zusatz des Geburtsnamens!)." value="Eva Gebhard geb. Zander" onchange="myFunction(this)"/>

+0

Танки Билл, это тоже отлично! –

0

Регулярное выражение должно быть разделено на /, а не '. Кроме того, у вас не должно быть места в начале, если вы этого не потребуете. Вы можете использовать .match() вместо .search(), чтобы получить правдивое/фальшивое значение, вместо сравнения с -1. А модификатор i делает совпадение без учета регистра, поэтому вам не нужно звонить toUpperCase().

$("input").change(function() { 
 
    var Name = this; 
 
    if (Name.value.match(/geb[. ]/i)) { 
 
    alert('Die Angabe des Geburtsnamens ist nicht erforderlich. Bitte weglassen!'); 
 
    this.focus(); 
 
    return false 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<input type="text">

+0

Спасибо, это выглядит неплохо, но он не поймает «Eva Gebhard geb Zander». Я не понимаю, почему. –

+0

Он ловит его для меня. – Barmar

+0

Хорошо, спасибо. Я уже многому научился. –

0

Это решение удовлетворяет вашим требованиям:

<input type="text" name="Name" size="25" 
title="Hier nur Vor- und Nachnamen in dieser Reihenfolge eingeben (bitte ohne Zusatz des Geburtsnamens!)." 
value="Eva Gebhard geb. Zander" 
onchange="javascript:if(this.value.search(/\bgeb\.?\b/i) > -1){alert('Die Angabe des Geburtsnamens ist nicht erforderlich. Bitte weglassen!'); setFocus(this); return false};" 
/> 

Это регулярное выражение в вопросе:

/\bgeb\.?\b/i 

Обновлено JSFiddle: https://jsfiddle.net/3rv2s3sc/6/

Объяснение регулярного выражения:

  • Фундаментальные знания:
    • Регулярные выражения в JavaScript заключены слэшами /
    • \b указует "границу слова" Слово не обязательно является истинным словом на человеческом языке. Он определяется как начало или конец «символов слова». Что это зависит от контекста. В нашем случае мы можем считать это буквой алфавита. Для получения дополнительной информации см. Word Boundaries
    • . - особый символ, означающий «любой символ». Поэтому, если вы хотите простой период, вам нужно «избежать специального символа». «Escape-символ» - это обратная косая черта \. Поэтому указывается буквальный период \.
    • ? - специальный символ, который делает предыдущий токен необязательным. («Токен» является символом/группой/подвыражением.)
    • После закрытия косой черты регулярного выражения вы можете указать несколько опций или директив. i здесь указывает «нечувствительность к регистру». (Вот почему мое решение не требует функции toUpperCase().)
  • интерпретация в обычном языке:
    • Регулярное выражение, соответствующее /
    • строка начинается с границы слова (может быть следующее место, период, тире и т.д. — точка есть, мы соответствие отчетливый и отдельное слово) \b,
    • строку geb,
    • дополнительный период символа \.?,
    • и другая граница слов \b,
    • матч не зависит от регистра. /i

Для получения более подробной информации о JavaScript регулярных выражений, смотрите следующие сайты:

+0

Спасибо. Это решение не ловит «Eva Gebhard geb Zander». Я что-то упускаю? –

+0

Извинения - я либо неправильно читал первую строчку, либо имел более раннюю версию. Я обновил свой ответ, чтобы включить использование специального символа '?' И краткое объяснение этого. –

+0

Привет @FrankSpade! Соответствует ли это вашим требованиям? –

0

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

<input type="text" name="Name" size="25" title="Hier nur Vor- und  Nachnamen in dieser Reihenfolge eingeben (bitte ohne Zusatz des Geburtsnamens!)." value="Eva Gebhard geb. Zander" 
      onchange="if (this.value.toUpperCase().match(/GEB/)) {alert('Die Angabe des Geburtsnamens ist nicht erforderlich. Bitte weglassen!'); setFocus(this); return false};" /> 
+0

Это будет соответствовать 'gebba'. Он только хочет сопоставить 'geb', если за ним следует'. 'Или пробел. – Barmar

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