2015-09-02 83 views
1

我很喜歡使用[^\u0000-\u007F]+^[A-Za-z0-9._-](?:[A-Za-z0-9._ -]*[A-Za-z0-9._-])?$作爲一個正則表達式,但它太複雜了,我只是不能使它工作?任何想法如何整合兩者?爲JavaScript創建正則表達式

我想使用JavaScript版本進行客戶端驗證,並使用Php版本進行服務器端驗證。

+2

介意告訴我們*您打算匹配什麼*而不僅僅是RegEx? – Joseph

+0

'[^ \ u0000- \ u007F] +'這是用於非英文字母的字符,如'àèéìòóùà'和這個'^ [A-Za-z0-9 ._-](?:[A-Za-z0 -9._ - ] * [A-Za-z0-9 ._-])?$'僅用於字母,數字,點,短劃線,下劃線和開始和結尾處的空格。 – Rough

+2

你的問題很不清楚。提供應該匹配的字符串和不應該匹配的字符串。你試圖做到什麼,出了什麼問題。 –

回答

2

我建議使用Unicode表的其餘部分[\u0080-\uFFFF]而不是[^\u0000-\u007F]

在JS,\w匹配[A-Za-z0-9_],我建議使用

^[\u0080-\uFFFF\w.-](?:[\u0080-\uFFFF\w. -]*[\u0080-\uFFFF\w.-])?$ 

demo

在PHP中,只需使用\p{L} with /u modifier

$re = '/^[\p{L}0-9_.-](?:[\p{L}0-9_. -]*[\p{L}0-9_.-])?$/u'; 
      ^^^^^   ^^^^^   ^^^^^   ^

它看起來像沒有人喜歡\uXXXX在PHP 。 @nhahtdh證實可能存在匹配相同代碼點的問題。

+0

你對第一個正則表達式的建議是可怕的。如果我們想要匹配ASCII範圍以外的字符,則必須始終使用'u'標誌來正確解釋輸入。帶有json_decode的解決方案只能工作,因爲編碼爲UTF-8的範圍是'\ xC2 \ x80- \ xEF \ xBF \ xBF',其中包含範圍'\ x80- \ xEF',字節UTF-8編碼序列。我認爲你的答案應該被編輯爲只包含第二個解決方案。 – nhahtdh

+0

在PHP中,如果您想通過代碼點指定字符,請使用'\ x {hh ... h}'語法。它也適用於字符類,但是範圍受限於模式(在默認模式下,直到代碼單元的大小 - 在PHP中爲0xFF,在u模式下最大爲0x10FFFF)。 – nhahtdh

+0

'\ p {L}'是一個正確的解決方案。 '\ u0080- \ uFFFF'上的'json_decode'是一個不帶'u'標誌的不安全解決方案 - 只需使用'\ x {hh ... h}'表示法。 – nhahtdh