2017-06-08 78 views
1

我很難嘗試突出顯示格式化電話號碼的搜索結果。php - preg_replace突出顯示格式化的電話號碼

$search_txt='5678'; // user generated (can be anything) 
$phone_number='(123) 456-7890'; // always in this format 

我想這得到突出顯示的字符串:

$highlighted = preg_replace('#'. preg_quote($search_txt) .'#i', '<span style="background-color:#ff0;">\\0</span>', $phone_number); 

$search_txt可以是任何東西。 「7890」作品,「456-7890」作品,但由於$phone_number中的「 - 」,「5678」不起作用。

我也嘗試過去除$phone_number(即「1234567890」)的格式,但是如果他們輸入字母「56-78」,我有同樣的問題。

如果我剝既$phone_number(「1234567890」)和$search_txt(「5678」),該突出的作品,並返回1234<span style="background-color:#ff0;">5678</span>90,但我不知道如何與字符串中的高亮度代碼重新引入的格式。

最後一個字符串需要是電話號碼格式「(123)456-7890」,並突出顯示包含的HTML。

選項1:我可以格式化電話號碼而忽略號碼內的HTML標籤嗎?

1234<span style="background-color:#ff0;">5678</span>90

變得(123) 4<span style="background-color:#ff0;">56-78</span>90

選項#2:我可以忽略在字母字符中$phone_number匹配時,而是包括它們的取代字符串中?

即 「5678」 將匹配 「(123)456-7890」

並返回(123) 4<span style="background-color:#ff0;">56-78</span>90

+0

保存在一個變量的原始格式號碼,然後剝離破折號另一個變量。進行比較並將原件作爲突出顯示的數字返回。 –

+0

我也試圖突出顯示格式化數字中的搜索項(「56-78」)(當他們搜索「5678」時)。原文需要部分突出顯示(不是整個字符串)。 – REV

回答

0

假設你的標籤沒有數值作爲一個明顯的例子:

$phone = "1234<span>5678</span>90"; $pattern = '/(\D*\d\D*\d\D*\d)(\D*\d\D*\d\D*\d)(\D*\d\D*\d\D*\d\D*\d\D*)/'; $replace = '($1) $2-$3'; echo "\n\n".preg_replace($pattern, $replace, $phone);

生產:

(123) 4<span>56-78</span>90

基本上我捕捉零或更多的非數字每個數字之前的值和最後一個數字之後的值。這假定您已將搜索字符串和目標電話號碼都減少爲簡單數字字符串(「4567」和「1234567890」),然後執行搜索和替換以放置HTML標記。

如果您的HTML標籤中必須有數字,那麼您必須用\ < [^>] *>之類的東西替換\ D。

$pattern = '/((?:<[^>]*>)*\d(?:<[^>]*>)*\d(?:<[^>]*>)*\d)...

的(?:...)建設項目組不捕捉它們。使用{}結構增添幾分優雅的,你必須:

$pattern = '/((?:(?:<[^>]*>)*\d){3})((?:(?:<[^>]*>)*\d){3})((?:(?:<[^>]*>)*\d){4}(?:<[^>]*>)*)/';

+0

關於'$ replace'的一個注意事項。我在結果中獲得了\(123 \)',所以我刪除了斜槓。 '$ replace ='($ 1)$ 2- $ 3';' - 感謝您的幫助。 – REV

+0

杜。感謝Rev.有時你只是無法看到森林的樹木。我改變了帖子。 – JBH