验证URL

Ani*_*may 6 forms typescript angular

目前,我正在使用Angular5。我尝试按以下方式验证URL:

HTML:

<div class="form-group col-sm-6">
  <input formControlName="s_url" type="url" class="form-control" id="kk" placeholder="url">
  <error-display [displayError]="isValid('s_url')" errMsg="This field is required!"></error-display>
</div>
Run Code Online (Sandbox Code Playgroud)

validate.ts文件中,我有这种模式:

s_url: new FormControl('', [
  Validators.required,
  Validators.pattern("/^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/")
]),
Run Code Online (Sandbox Code Playgroud)

但是使用该模式,即使键入正确的URL,也会显示错误消息。

Mic*_*oye 12

您可以通过稍微修改和分隔正则表达式来尝试这种方式:

const reg = '(https?://)?([\\da-z.-]+)\\.([a-z.]{2,6})[/\\w .-]*/?';
...
Validators.pattern(reg)
Run Code Online (Sandbox Code Playgroud)

根据我自己的经验,当直接将引号(")和斜杠(/)传递给正则表达式时,有时会导致正则表达式出现问题.pattern()


这是一个正在工作的演示

  • 我建议使用更完整的正则表达式(包括带有查询参数的网址) `var URL_REGEXP = /^[A-Za-z][A-Za-z\d.+-]*:\/*(?:\w+( ?::\w+)?@)?[^\s/]+(?::\d+)?(?:\/[\w#!:.?+=&amp;%@\-/]*)? $/;` 从 angularjs 源代码复制(https://github.com/angular/angular.js/commit/ffb6b2fb56d9ffcb051284965dd538629ea9687a) (5认同)
  • 它不使用查询参数来验证 URL,如`http://demosite.com/#/admin/project/project-details?id=34` (2认同)
  • 这不是协商的对象。打开一个新线程。 (2认同)

rea*_*pie 11

您还可以使用 URL API,在撰写本答案时该 API 的支持率为 95%。请参阅此处的浏览器支持

urlValidator: ValidatorFn = (control: AbstractControl) => {
    let validUrl = true;

    try {
      new URL(control.value)
    } catch {
      validUrl = false;
    }

    return validUrl ? null : { invalidUrl: true };
  }

  searchControl = this.fb.control(null, this.urlValidator);
Run Code Online (Sandbox Code Playgroud)

  • 这似乎根本没有考虑协议。 (2认同)

Ale*_*mov 5

例如,根据您的要求,如果您不想RegExp为 URL处理 \maintain a ,则可以将工作委托给浏览器的内置表单验证工具。

它可以这样实现:

const control: HTMLInputElement = document.createElement("input");
control.type = "url";
control.value = value;
const isValid: boolean = control.checkValidity();
Run Code Online (Sandbox Code Playgroud)


Ham*_*ini 5

我认为这个正则表达式更完整:

const urlRegex = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/;
this.form = this.fb.group({
      s_url: ['', [Validators.required, Validators.pattern(urlRegex)]],
    });

Run Code Online (Sandbox Code Playgroud)

在此处进行模式检查

  • **%** 是有效字符,通常与包含特殊字符的编码字符串一起使用。正则表达式会更好 /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\- \._~:/?%#[\]@!\$&amp;'\(\)\*\+,;=.]+$/ (2认同)