iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
Modern Web

從零打造網頁系統:非資訊人也能完成的全端專題實作系列 第 25

Day 25: Vue表單前端驗證及正則表達式(regular expression)

  • 分享至 

  • xImage
  •  

通常在使用者填寫表單時,網頁開發者會預設一定的輸入格式,避免使用者填寫一些不符合預期的內容,導致後續資料清理上所造成的時間浪費,並且若使用者所填寫的內容,與該項目預設格式不相容,將可能導致資料傳送到後端伺服器時,出現錯誤,更是徒增維護上困難。

因此可以看到在前面的表單填寫項目中,都會有配置對應的驗證方法,以確保填寫內容符合預期格式,參考如下:

// src/components/Employee/EmployeeModal.vue
export default {
  
  methods: {

    // 各欄位驗證(配合 template 的 :class 與錯誤訊息)
    validateName() {
      this.nameState = this.form.name.trim() !== "";
    },
    validateAge() {
      this.ageState = this.form.age > 0;
    },
    validatePhone() {
      const regex = /^09\d{8}$/;
      this.phoneState = regex.test(this.form.phone.toString().trim());
    },
    validateIdentity() {
      this.identityState =
        this.form.identity === "FULL" || this.form.identity === "PART";
    },
    validateSalaryType() {
      this.salaryTypeState =
        this.form.salary_type === "MONTH" || this.form.salary_type === "HOUR";
    },

  }
};
  • 姓名項目,this.form.name.trim() !== "",乃先將輸入以trim()去頭尾空白後,再檢查是否為非空字串。
  • 年齡項目,this.form.age > 0,單純檢查輸入的數字是否大於0。
  • 身分別、薪別項目,因為提供選單給使用者選取,故檢查是否為選單中任一選項,即檢查是否有選值。
  • 手機項目,regex.test(this.form.phone.toString().trim()),檢查是否符合正則表達式(regular expression)所要求的格式,如regex = /^09\d{8}$/。正則表達式於控制文字內容格式時,相當有用,語法上對於剛接觸者,會相對陌生,因此想針對正則表達式做進一部介紹。

正則表達式的基本語法

// 正則字面量(regular expression literals),適合於pattern固定的場合
const regex = /pattern/flags;
const regex = /^09\d{8}$/; // 09開頭,其後接8個數字,即09xxxxxxxx

// 正則建構子(RegExp constructor),適合於需動態產生pattern時
const regex = new RegExp(pattern, flags);
const regex = new RegExp("^09\\d{8}$");
  • 正則字面量(regular expression literals),語法乃將所要規範的模式(pattern),包於兩個斜線之中/ … /,可視需求加上修飾符,即/pattern/flags,適合用於pattern固定不變的情況。
  • 正則建構子(RegExp constructor),則於需要時才建立模式(pattern),以類似函式的語法將pattern當作參數引入,即RegExp(pattern, flags)。需要注意的是,採用建構子語法,反斜線符號「\」要再加一次跳脫符號「\」,即需寫為「\」。
  • 模式中,需要標出開頭及結尾,分別以^(標記pattern的開頭)及$(標記pattern的結尾)符號表示,在兩個符號之間,可填入所想要規範的文字內容格式。
  • 模式中可直接放入所想要的字元,即要求一定要出現該字元,包括順序、個數皆要符合,如/^09$/,代表模式一定要是2個數字字元,且一定要為09。
  • 但正則表達式強大的地方在於,可以僅用特殊符號,來包含特定字元,以能簡潔地達到限制文字內容格式的效果,相關符號可參考以下表格。
  • 常見字元類別的符號,可參考以下表格:
符號 意義 範例
. 任何單一字元(不含換行) /a.c/ → "abc", "axc" ✅
\d 數字(0–9) /\d/ → "5" ✅
\D 非數字 /\D/ → "a" ✅
\w 英數及底線([A-Za-z0-9_]) /\w/ → "A", "3" ✅
\W 非英數及底線 /\W/ → "@" ✅
\s 空白字元(空格\t\n) /\s/ → " " ✅
\S 非空白字元 /\S/ → "A" ✅
  • 常見的數量限定,要注意的是,此數量限定的作用,僅會作用於符號之前的那1個字元或群組上,可參考以下表格:
符號 意義 範例
* 0個或多個 /ab*c/ → "ac", "abc" ✅
+ 1個或多個 /ab+c/ → "abc", "abbc" ✅
? 0或1個 /ab?c/ → "ac", "abc" ✅
{n} 剛好n個 /\d{4}/ → "2025" ✅
{n,} 至少n個 /\d{2,}/ → "12", "1234" ✅
{n, m} n到m個 /\d{2,4}/ → "12", "1234" ✅
  • 群組與選擇的方式,可參考以下表格:
符號 意義 範例
[ ] 字元集合(包起來的擇一符合) /[abc]/ → "a", "b" or "c" ✅
[^] 排除集合 /[^abc]/ → 非 a、b、c ✅
( ) 群組(包起來的需同時符合) /(abc){2}/ → "abcabc" ✅
` ` 或(OR)

正則表達式在初學時,不容易掌握他的要點,很容易會陷入各種符號表格的泥淖,被一堆抽象符號及對應結果搞昏頭,變成逢正則表達式必怕的惡性循環。

學習正則表達式的唯一捷徑,就是針對實例去進行查表比對,才能快速熟悉相關語法,一開始不要接觸太過複雜的表達式,先從基本的符號開始熟悉,等到看到相關語法不會覺得恐懼,就可以再去接觸進階的語法,此時網路上各種正則表達式符號的表格,才會真正對你起到幫助。


上一篇
Day 24: Vue互動視窗(modal)及表單(form)
下一篇
Day 26: Django專案結構簡單介紹
系列文
從零打造網頁系統:非資訊人也能完成的全端專題實作29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言