2 回答

TA貢獻1946條經驗 獲得超3個贊
似乎您沒有在驗證,那么您可能正在嘗試編寫一些邊界較少的表達式,例如:
^\+?[0-9()\s-]{8,25}[0-9]$
如果你想簡化/修改/探索表達式,它已經在regex101.com 的右上角面板中進行了解釋。如果您愿意,您還可以在此鏈接中觀看它如何與某些示例輸入匹配。

TA貢獻1836條經驗 獲得超3個贊
我預測您的模式會讓您失望而不是讓您滿意(或者您對項目范圍內的“過度匹配”感到非常滿意)。
雖然我的建議確實超出了模式長度,但(*SKIP)(*FAIL)通過消耗和丟棄需要取消資格的子字符串,一種技術可以很好地為您服務??赡苡幸环N方法可以通過環視來指示模式邏輯,但是由于初始模式中有如此多的潛在漏洞且沒有樣本數據,因此變量太多,無法提出自信的建議。
代碼:
$text = <<<TEXT
A number 555555555 then some more text and a quoted number "(123)4567890" and
then 1 2 3 4 6 (54) 3 -2 and forward slashed /+--------0/ versus
+--------0 then something more realistic '234 588 9191' no more text.
This is not closed by the same character on both
ends: "+012345678901/ which of course is a _necessary_ check?
TEXT;
echo preg_replace(
'~([\'"/])\+?[\d()\s-]{8,25}\d{1,2}\1(*SKIP)(*FAIL)|((?!\s)\+?[\d()\s-]{8,25}\d{1,2})~',
"<strong>$2</strong>",
$text);
輸出:
A number <strong>555555555</strong> then some more text and a quoted number "(123)4567890" and
then <strong>1 2 3 4 6 (54) 3 -2</strong> and forward slashed /+--------0/ versus
<strong>+--------0</strong> then something more realistic '234 588 9191' no more text.
This is not closed by the same character on both
ends: "<strong>+012345678901</strong>/ which of course is a _necessary_ check?
有關技術細分,請參閱 Regex101 鏈接。
否則,這是有效地檢查“電話號碼”(由最初的模式),如果它們被包裹',"或/則匹配被忽略,正則表達式引擎繼續尋找那個子后的比賽。我(?!\s)在您的電話模式的第二次使用開始時添加了,以便在替換時省略前導空格。
- 2 回答
- 0 關注
- 205 瀏覽
添加回答
舉報