2016-02-11 19 views
-1

我有什么正则表达式来移除YouTube链接

$string = "bla bla bla bla bla <a href='http://youtube.com/watch?=XXXXX'>my video</a> ble ble ble ble <a href='http://google.com'>google</a>"; 

我想

$string = "bla bla bla bla bla ble ble ble ble <a href='http://google.com'>google</a>"; 

我只想删除YouTube的链接

+1

我看到两件事情是错误的。首先,很容易使用URL缩写来解决这种问题。其次,假设这些内容来自用户,并且您允许使用标签,则可以显示任何类型的HTML。这允许HTML注入和XSS攻击 –

回答

2

这种模式适用于您发布的例子是什么,让我知道你是否需要它更具体。

$re = "/^(.*?)<a .*youtube.*>.*<\\/a>(.*?)$/Ui"; 
$str = "bla bla bla bla bla <a href='http://youtube.com/watch?=XXXXX'>my video</a> ble ble ble ble <a href='http://google.com'>google</a>"; 

preg_match($re, $str, $matches); 
$string = isset($matches[2]) ? $matches[1] . $matches[2] : ""; // Return a blank string for no match 
+2

这个例子只会删除一个youtube链接,效率会低于使用preg_replace() –

+0

我同意你在这里,preg_replace是更好的解决方案。我想我有机会玩正则表达式高尔夫球,并错过了原始点:S – Hiphop03199

3

这应该做的伎俩,删除所有在他们的单词youtube somwhere的A标签。

$string = "bla bla bla bla bla <a href='http://youtube.com/watch?=XXXXX'>my video</a> ble ble ble ble <a href='http://google.com'>google</a>"; 
echo preg_replace("#(<a.*youtube.*a>)#U","",$string); 

你可以扩展这个进一步的检查youtube.com/或财产以后更精确,如果您需要。

+1

很好的正则表达式! – Cuchu

1

尝试此解决方案:

<?php 
$dom = new DOMDocument; 
$string = "bla bla bla bla bla <a href='http://youtube.com/watch?=XXXXX'>my video</a> ble ble ble ble <a href='http://google.com'>google</a>"; 
$dom->loadHTML($string); 

print_r("<pre>"); 
print_r($string); 
print_r("</pre>"); 

print_r("<br />"); 

$elements = $dom->getElementsByTagName('a'); 
for ($i = $elements->length; --$i >= 0;) { 
    $href = $elements->item($i); 
    if(strpos($href->getAttribute('href'), "youtube")) { 
     $href->parentNode->removeChild($href);  
    } 
} 
$html = $dom->saveHTML(); 

print_r("<pre>"); 
print_r($html); 
print_r("</pre>"); 
die; 

输出:

唧唧歪歪BLA BLA我的视频BLE BLE BLE BLE谷歌

BLA BLA唧唧歪歪BLE BLE BLE BLE谷歌