2016-08-12 49 views
-1

我有一个这样的HTML到一个PHP变量称为$html删除从HTML一些文字:如何使用PHP

<html> 
 
    <head> 
 
     <title>MyPage</title> 
 
     <meta charset="UTF-8"> 
 
     <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
    </head> 
 
    <body> 
 
     <h1>MyPage</h1> 
 
     <h2>{SUBTITLE}</h2> 
 
     <div>{BODY}</div> 
 
    </body> 
 
</html>

我需要删除的标签和标签里面的内容,如果标签内只出现{something}。例如,在这种情况下,行:

<h2>{SUBTITLE}</h2> 
<div>{BODY}</div> 

必须删除。

我想在这样的事情:

$html = str_replace('{'%%'}', '', $html); 

这条线是不行的,但我尝试这样做的,即开始和结束“{”和“}”有什么替代词(我不知道该怎么做),另一个问题是如何删除空标签。

+0

使用''的preg_replace()的代替'str_replace()函数'用正则表达式。 http://php.net/preg_replace –

+0

我认为最好的是使用XPath与正则表达式 - 请参阅[我的答案](http://stackoverflow.com/a/38916869/3832970)。 –

回答

0

您可以使用正则表达式。

你的正则表达式可以是这样的:

<\w*>{\w*}<\/\w*>

该搜索起始<,其次是1-n的文字或数字,然后>。再其次是{,1-n的文字或数字,}</,1-n的文字或数字,最后收盘>

$html = preg_replace('/<\w*>{\w*}<\/\w*>/', '', $html); 

这不仅更换内容,但删除标签本身也是如此。

+0

简短,有效且易于理解。谢谢:) –

0

使用正则表达式是充满了问题,我会跟DOMDocumentDOMXPath

$html=' 
<html> 
    <head> 
     <title>MyPage</title> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    </head> 
    <body> 
     <h1>MyPage</h1> 
     <h2>{SUBTITLE}</h2> 
     <h2>Gigantic Ants ate my brain</h2> 
     <div>{BODY}</div> 
     <div>Squashed by a green banana</div> 
    </body> 
</html>'; 

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

/* tweak the XPath queries to suit your requirements */ 
/* 
    There are many XPath cheatsheets available but for reference: 
    http://xpath.alephzarro.com/content/cheatsheet.html 
    http://scraping.pro/res/xpath-cheat/xpath_css_dom_recipes.pdf 
*/ 
$col=$xp->query('//h2[contains(text(),"{SUBTITLE}")]|//div[contains(text(),"{BODY}")]'); 

if($col){ 
    foreach($col as $n)$n->parentNode->removeChild($n); 
} 

echo '<textarea cols=100 rows=50>',$dom->saveHTML(),'</textarea>'; 
$dom=$xp=null; 
+0

这并不回答这个问题,因为'{...}'之间的内容可以是任何内容。 –

+0

这个问题在内容上有点模糊,但对查询的一些简单调整可能会产生所需的结果 – RamRaider

+0

请参阅[我在XPath中使用正则表达式的方法](http://stackoverflow.com/a/38916869/3832970),I认为这是这里最灵活的。 –

1

去你可以使用正则表达式匹配HTML标签之间的所有代码片段,包裹在{}。在你的情况,将成为:

$html = '<html><head><title>MyPage</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><h1>MyPage</h1><h2>{SUBTITLE}</h2><div>{BODY}</div></body></html>'; 
$pattern = '/<([\w]+)[^>]*>{([^}]*)}<\/\1>/'; 

echo preg_replace($pattern, '', $html); 
// outputs <html><head><title>MyPage</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><h1>MyPage</h1></body></html> 
2

我建议使用XPath方法里面正则表达式在这里:获取具有文本开始{}/^{[^}]+}$/结尾的所有元素节点(正则表达式可以调整到说/^{[A-Z]+}$/):

$xpath->query("//*[php:functionString('preg_match', '$regex', text())>0]") 

该行刚刚获得的所有元素(*),其内文(text())相匹配的$regex

这里是一个PHP demo

$html = "<YOU_HTML_STRING_HERE>"; 
$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); // Load the HTML string and init DOM 

$xpath = new DOMXPath($dom); // Init XPATH 
// you need to register the namespace "php" to make it available in the query 
$xpath->registerNamespace("php", "http://php.net/xpath"); 
$xpath->registerPhpFunctions(); 

// add delimiter to your pattern 
$regex = '/^{[^}]+}$/'; 

// search your node anywhere in the DOM tree with "//" 
$items = $xpath->query("//*[php:functionString('preg_match', '$regex', text())>0]"); 

foreach ($items as $tag) { 
    $tag->parentNode->removeChild($tag); 
} 
echo $dom->saveHTML(); 
+0

谢谢,但它的代码太多而不是只有一行代码:) –

+0

好的,这是你的选择。人非圣贤孰能。 –