2014-02-27 44 views
0

在我的頁面上,用戶可以將嵌入鏈接插入到他們的音樂中。但是,如果對象的寬度超過600像素,則不適合頁面。所以我正在尋找一些方法來查找iframe標籤的寬度參數,如果該值超過600px,則將其更改爲600px。但是我的谷歌技巧讓我失望了,所以我希望這裏的某個人能夠幫助。插入的I幀尋找例子是這樣的:如何查找和更改字符串中的html值

<iframe width="660" height="180" src="//www.mixcloud.com/widget/iframe/?feed=http%3A%2F%2Fwww.mixcloud.com%2FCLCK_Podcast%2Fclck-podcast-20-czscream%2F&amp;embed_type=widget_standard&amp;embed_uuid=fd5ce7dc-9687-45e1-8368-27631b48385f&amp;hide_tracklist=1&amp;replace=0&amp;hide_cover=1" frameborder="0"></iframe> 

回答

-3

讓我們嘗試用正則表達式:

$pattern = '/<iframe (.*)width="([0-9]{4,}|[6-9][0-9]{2})"(.*)>(.*)<\/iframe>/'; 
$replace = '<iframe $1 width="600" $3>$4</iframe>'; 
$output = preg_replace($pattern, $replace, $input); 

$output將是你用有效的I幀有效的字符串; )

Online Demo

+0

不錯!這就像一個魅力!但也要感謝Amal! –

+2

-1。這個解決方案非常脆弱,並且會破壞很多情況。使用'。*'進行匹配幾乎不是一個好主意。 –

+0

好吧,你的方法也不完美。看一下示例https://eval.in/106488。我認爲我們想提供一個解決方案,而不是爭論哪種方法更好,更安全。 – Doro

5

下面是如何使用PHP的本地DOM extensions做正確。不像正則表達式,這是保證對所有的情況下工作,當有一個稍微不同的HTML標記的格式提供不會嗆:

$dom = new DOMDocument; 
$dom->loadHTML($html);  
$html = ''; 

foreach ($dom->getElementsByTagName('iframe') as $iframe) { 

    // get the 'width' attribute value 
    $width = (int) $iframe->getAttribute('width');  

    // obvious 
    if ($width > 600) { 
      $iframe->setAttribute('width', 600); 
    } 

    // append the modified HTML to string 
    $html .= $dom->saveHTML($iframe) . "\n";     
} 

echo $html; 

這將檢查的所有 標籤width屬性並將其設置爲如果當前值大於此值,則爲600

Online demo

+0

謝謝,這看起來不錯...但如果我有更多的iframes在字符串中,在輸出它離開只是第一個iframe,其他人丟失... –

+0

@MichalS:更新了答案。 –

+0

仍然沒有工作:/我甚至完全按照你的例子,與多個,但靜態的內置頁框... –

2

這讀對我來說,錯誤的做法,請參閱:the XY problem

看着你的問題,它看起來像你允許用戶在你的網站上添加和運行任意代碼。這可能是一件非常糟糕的事情。什麼是阻止某人利用XSS如果他們被允許這樣做?即使你正確過濾(我懷疑),它仍然聽起來像是錯誤的方法。

用戶只需要添加一個鏈接到您的網站,以便您完全控制進一步的嵌入和渲染。這將防止各種討厭的狗屎。