2016-05-31 110 views
0

我在我的網站上輸入用戶輸入信息,並允許通過所見即所得的編輯器進行格式轉換。正則表達式將htmlspecialchars轉義字符轉換回

現在我通過帶有ENT_quotes的htmlspecialchars運行我在PHP中獲得的整篇文章。

從那裏我想運行一個正則表達式來將我允許的規則轉換回真正的html。

這樣

<p>TEXT</p> 

成爲

<p>TEXT</p> 

有沒有辦法用正則表達式來做到這一點?我不是它的家庭。但基本上尋找逃脫的標籤,並將其替換爲真正的標籤,同時保持中間的一切?

編輯:我想正則表達式來使有效的HTML代碼。首先,我通過htmlspecialchars運行整個事情,100%安全並獲得所有字符的實體版本。然後我想要一個正則表達式來只將我想要的標籤轉換回正常。我不想將所有實體解碼回常規,我只想解碼我想要的標籤。所以例如一個正則表達式搜索&lt;p&gt;TEXT&lt;/p&gt;回到<p>TEXT</p> - 我不想重新轉換它們自己的<,&,>。我只想重新轉換我想要的標籤。在這個例子中是段落標籤。

+0

我希望它是有效的HTML。我首先通過htmlspecialchars運行整個事情以100%安全。然後我想要一個正則表達式來只將我想要的標籤轉換回正常。 – Incognito

+0

這是一個例子。我想「

TEXT

」,這是「<p> TEXT </P >」用htmlspecialchars後成爲真正的HTML「

TEXT

」 這樣,我已經編碼所有用戶輸入到實體的編碼版本。然後使用一個正則表達式來回寫只有我想回到真正的HTML標籤。 – Incognito

+0

不允許屬性。所有引號都會被htmlspecialchars ent_quotes轉義。 我不想讓報價回到他們的真實版本。只有使用reged才能找到

的編碼版本,並以

的編碼版本結尾,並將其恢復爲真實的html。 – Incognito

回答

1

我想這正則表達式應該爲你描述下什麼工作:

/&lt;(\/?)(allowed_tags_here_seperated_by_|)&gt;/ 

正則表達式演示:https://regex101.com/r/uX7cT1/1
PHP演示:https://eval.in/579884

PHP用法:

$allowed_tags = array('p', 'h1'); 
$regex = '/&lt;(\/?)(' . implode('|', $allowed_tags) . ')&gt;/'; 
$test_string = '&lt;p&gt;TEXT&lt;/p&gt; This & that don\'t <decode> these though <h2> &lt;h1&gt; &lt;p class=&quot;test&quot;&gt;'; 
echo preg_replace($regex, '<$1$2>', $test_string); 

哦,這也沒有考慮到自閉元素。 <br />,<hr />,<img stuff />

+0

我不會有任何自閉元素,所以很好。我讓我的編輯不使用
或換行符。 這看起來很嚇人,它幾乎正是我想要的。但我不認爲它正在搜索結束標籤? 我想查找開始和結束標記...然後解碼它們並將所有內容保存在中間。那有意義嗎?這樣,如果有人輸入

並且不關閉標籤,它不會使頁面上的所有文本成爲一個巨大的標題。 – Incognito

+0

它搜索關閉元素,它不關心是否有開放的元素。對於這可能是這樣的,https://regex101.com/r/uX7cT1/2將工作? – chris85

+0

謝謝你的工作,我不能upvote呢。 (沒有足夠的代表)但是你真棒。 – Incognito

0

我想你需要html_entity_decode()

+0

問題是,它是否會將所有字符轉換回來。我特別注意了整個原始輸出。然後我想要的東西,p,strong,blockquote等我想要轉換回真正的html> 這樣一切都逃脫minsu我允許的東西。 – Incognito