[問題] 關於標記出指定字串的問題

看板PHP作者 (香蕉共和國)時間10年前 (2015/06/06 21:22), 編輯推噓1(1019)
留言20則, 4人參與, 最新討論串1/1
我希望用PHP來標記(highlight)出指定的字串,其中當遇到「HTML實體」時要特別小心, 因為當指定的字串($search_txt)是分號(;)時,可能連HTML實體的末端字元也會一起被標 到,而這不是我想要的結果,於是我自己寫了以下的程式: http://www.red-whale.com.tw/test/PHP-test/index.phps 發現還挺不賴的,但是摸到最後還是發現的一些問題: 當$search_txt="a&ffg";時,理應要在content中間highlight出該字串出來,但是它 卻沒有標出來。我原先的步驟是:先將HTML實體以外的字串拆開成許多小節(分散在陣列 中),在各小節搜尋並highlight含有$search_txt的字串。再來將各節的HTML實體一一拿出 來檢驗是否與$search_txt相等(因為$search_txt本身也有可能是一個HTML實體),若有也 highlight它。但萬萬沒想到還有一個case,那就是若$search_txt當中若同時含有HTML實 體和其他字元那該怎麼辦? 這就讓我頭大了,請各位幫幫我怎麼解決這個問題,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.80.136.111 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1433596975.A.8AF.html

06/06 21:29, , 1F
註:content裡的內容都已經事先htmlspecialchars了
06/06 21:29, 1F

06/07 03:58, , 2F
我覺得你要反過來想, 你要標示的是顯示出來的字串
06/07 03:58, 2F

06/07 03:58, , 3F
那麼你應該要先解掉 htmlspecialchars 再做搜尋
06/07 03:58, 3F

06/07 04:01, , 4F
或者如果你有原始字串的話, 先標出來再上 htmlspecialchars
06/07 04:01, 4F

06/07 09:46, , 5F
但是程式如果先標記再做htmlspecialchars的話,連
06/07 09:46, 5F

06/07 09:47, , 6F
<font color=red><b>...</b></font>這些標籤也會被一
06/07 09:47, 6F

06/07 09:48, , 7F
併轉換成HTML實體,所以順序上是不能改變的
06/07 09:48, 7F

06/07 17:29, , 8F
如果 search_txt 也是已經 htmlspecialchars 的狀態了
06/07 17:29, 8F

06/07 17:30, , 9F
直接用一行 str_replace 會有什麼問題嗎@@
06/07 17:30, 9F

06/07 19:12, , 10F
當$content="abc&amp;ggf";且$search_txt="mp;ggf"時
06/07 19:12, 10F

06/07 19:14, , 11F
照理來說不應該做任何標記(因為顯示出來的畫面結果第
06/07 19:14, 11F

06/07 19:15, , 12F
一個變數($content)會是:「abc&ggf」,而第二個變數
06/07 19:15, 12F

06/07 19:16, , 13F
($search_txt)會是:「mp;ggf」,顯然第一個變數字串
06/07 19:16, 13F

06/07 19:17, , 14F
沒有包含第二個變數字串),但是如果用str_replace的話
06/07 19:17, 14F

06/07 19:22, , 15F
就會變成「mp;ggf」標紅字了,整體的HTML碼會變成「
06/07 19:22, 15F

06/07 19:23, , 16F
abc&a<font color=red><b>mp;ggf</b></font>」,而這
06/07 19:23, 16F

06/07 19:23, , 17F
不是我想要的結果
06/07 19:23, 17F

06/07 19:26, , 18F
總而言之,把HTML實體看作是一個字,不要被其他片段的
06/07 19:26, 18F

06/07 19:26, , 19F
字一起給標記住了
06/07 19:26, 19F

06/07 21:02, , 20F
先html_entity_decode?
06/07 21:02, 20F
文章代碼(AID): #1LSlGlYl (PHP)
文章代碼(AID): #1LSlGlYl (PHP)