如何验证文本区域中的模式匹配?

Posted

技术标签:

【中文标题】如何验证文本区域中的模式匹配?【英文标题】:How to validate pattern matching in textarea? 【发布时间】:2012-11-18 13:37:15 【问题描述】:

当我在 javascript 中使用 textarea.checkValidity() 或 textarea.validity.valid 且值无效时,两者总是返回 true,我做错了什么?

<textarea name="test" pattern="[a-z]1,30(,[a-z]1,30)*" id="test"></textarea>​

jQuery('#test').on('keyup', function() 
    jQuery(this).parent().append('<p>' + this.checkValidity() + ' ' +
    this.validity.patternMismatch + '</p>');
);

http://jsfiddle.net/Riesling/jbtRU/9/

【问题讨论】:

好像textarea doesn't have the pattern attribute,所以浏览器很可能会忽略它。 然而我已经用了很多年了,效果很好 【参考方案1】:

html5 &lt;textarea&gt; 元素不支持 pattern 属性。

查看MDN doc 以了解允许的&lt;textarea&gt; 属性。

您可能需要自己定义此功能。

或者按照定义 JavaScript/jQuery 函数的传统 HTML 4 做法来执行此操作。

【讨论】:

【参考方案2】:

您可以使用setCustomValidity() 自己实现此功能。 这样,this.checkValidity() 将回复您想要应用于您的元素的任何规则。 我不认为this.validity.patternMismatch 可以手动设置,但如果需要,您可以使用自己的属性。

http://jsfiddle.net/yanndinendal/jbtRU/22/

$('#test').keyup(validateTextarea);

function validateTextarea() 
    var errorMsg = "Please match the format requested.";
    var textarea = this;
    var pattern = new RegExp('^' + $(textarea).attr('pattern') + '$');
    // check each line of text
    $.each($(this).val().split("\n"), function () 
        // check if the line matches the pattern
        var hasError = !this.match(pattern);
        if (typeof textarea.setCustomValidity === 'function') 
            textarea.setCustomValidity(hasError ? errorMsg : '');
         else 
            // Not supported by the browser, fallback to manual error display...
            $(textarea).toggleClass('error', !!hasError);
            $(textarea).toggleClass('ok', !hasError);
            if (hasError) 
                $(textarea).attr('title', errorMsg);
             else 
                $(textarea).removeAttr('title');
            
        
        return !hasError;
    );

【讨论】:

很好的答案,感谢您的提琴。它帮助了我! 谢谢,很高兴能帮上忙。 :)【参考方案3】:

这将启用 DOM 中所有文本区域的 pattern 属性并触发 Html5 验证。它还考虑了具有^$ 运算符的模式,并使用g 正则表达式标志进行全局匹配:

$( document ).ready( function() 
    var errorMessage = "Please match the requested format.";

    $( this ).find( "textarea" ).on( "input change propertychange", function() 

        var pattern = $( this ).attr( "pattern" );

        if(typeof pattern !== typeof undefined && pattern !== false)
        
            var patternRegex = new RegExp( "^" + pattern.replace(/^\^|\$$/g, '') + "$", "g" );

            hasError = !$( this ).val().match( patternRegex );

            if ( typeof this.setCustomValidity === "function") 
            
                this.setCustomValidity( hasError ? errorMessage : "" );
             
            else 
            
                $( this ).toggleClass( "error", !!hasError );
                $( this ).toggleClass( "ok", !hasError );

                if ( hasError ) 
                
                    $( this ).attr( "title", errorMessage );
                 
                else
                
                    $( this ).removeAttr( "title" );
                
            
        

    );
);

【讨论】:

是的,这样更干净。 :) 实际上,输入中的模式属性允许在正则表达式中使用 ^$,即使它们是隐式的。 ^ 和 $ 替换不起作用。它应该是全局(带 /g)正则表达式(带斜杠),而不是字符串中的正则表达式:var patternRegex = new RegExp('^' + pattern.replace(/^\^|\$$/g, '') + '$', 'g'); 我试图让它在每行寻找电子邮件地址的小提琴上工作。我能做的最好的事情是添加一个 m 修饰符,然后如果 ANY 行上有一个电子邮件地址,它就会匹配。仍然不是我想要的。 Yann 上面的第一个示例运行正常。您将如何使用这种方法来解决问题?这是我创建的小提琴:jsfiddle.net/da1hg19e @YannDìnendal 完全同意,我相应地修改了代码。 @BrianLayman 您绝对可以使用m 多行自定义标志,但这也可以通过利用 \n\r 符号来编写正则表达式来实现 似乎使用 HTML 实体是解决方法。代替[^'"],使用[^&amp;apos;&amp;quot;]【参考方案4】:

如果有其他人使用 React-Bootstrap HTML 表单验证而不是 jQuery。

这并没有明确使用pattern,但它的工作方式相同。

我只是对documentation 进行了一些更改。

function FormExample() 
  const [validated, setValidated] = useState(false);
  const [textArea, setTextArea] = useState('');
  const textAreaRef = useRef(null);

  const handleSubmit = (event) => 
    const form = event.currentTarget;
    if (form.checkValidity() === false) 
      event.preventDefault();
      event.stopPropagation();
    

    setValidated(true);
  ;

  const isValid = () => 
    // Put whichever logic or regex check to determine if it's valid
    return true;
  ;

  useEffect(() => 
    textAreaRef.current.setCustomValidity(isValid() ? '' : 'Invalid');
    // Shows the error message if it's invalid, remove this if you don't want to show
    textAreaRef.current.reportValidity();
  , [textArea];

  return (
    <Form noValidate validated=validated onSubmit=handleSubmit>
      <Form.Row>
        <Form.Group md="4" controlId="validationCustom01">
          <Form.Label>Text area</Form.Label>
          <Form.Control
            required
            as="textarea"
            ref=textAreaRef
            placeholder="Text area"
            value=textArea
            onChange=(e) => setTextArea(e.target.value)
          />
          <Form.Control.Feedback>Looks good!</Form.Control.Feedback>
        </Form.Group>
      </Form.Row>
      <Button type="submit">Submit form</Button>
    </Form>
  );


render(<FormExample />);

【讨论】:

以上是关于如何验证文本区域中的模式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止文本区域中的重复空格

如何使用jQuery更改文本区域中的行数

如何查找文本区域中的文本是不是换行为多行?

如何识别富可编辑文本区域中的文本溢出

如何以角度突出显示文本区域中的文本?

jquery - 计算文本区域中的字符[重复]