我将尝试用一个例子来解释这个问题。
我们说我有一个很大的html字符串,其中包括以下类型的表格单元。
<table id="table-1">
<tbody>
<tr><td><p>{{Phrase 1}}</p></td></tr>
</tbody>
</table>
<table id="table-2">
<tbody>
<tr><td><p>Sample text 1 goes here..</p></td></tr>
</tbody>
</table>
<table id="table-3">
<tbody>
<tr><td><p>{{Phrase 2}}</p></td></tr>
</tbody>
</table>
<table id="table-4">
<tbody>
<tr><td><p>Sample text 2 goes here..</p></td></tr>
</tbody>
</table>
如果html字符串包含PHP
或{{Phrase 1}}
,我需要{{Phrase 2}}
函数来排除整个表格。
仅在上面的示例中,我需要排除table-1
&amp; table-3
,结果字符串就像下面一样,
<table id="table-2">
<tbody>
<tr><td><p>Sample text 1 goes here..</p></td></tr>
</tbody>
</table>
<table id="table-4">
<tbody>
<tr><td><p>Sample text 2 goes here..</p></td></tr>
</tbody>
</table>
我尝试了preg_replace
功能,但它没有工作,因为我只能替换所选文本而不是整个单元。
这里的任何人都可以帮我解决这个问题。
我到目前为止仍在尝试开发它的示例代码。
$patterns = array();
$patterns[0] = '{{Phrase 1}}';
$patterns[1] = '{{Phrase 2}}';
$replacements = array();
$replacements[0] = '';
$replacements[1] = '';
$string = '<table id="table-1">
<tbody>
<tr><td><p>{{Phrase 1}}</p></td></tr>
</tbody>
</table>
<table id="table-2">
<tbody>
<tr><td><p>Sample text 1 goes here..</p></td></tr>
</tbody>
</table>
<table id="table-3">
<tbody>
<tr><td><p>{{Phrase 2}}</p></td></tr>
</tbody>
</table>
<table id="table-4">
<tbody>
<tr><td><p>Sample text 2 goes here..</p></td></tr>
</tbody>
</table>';
echo '<pre>';
echo htmlspecialchars(preg_replace($patterns, $replacements, $string));
echo '</pre>';
答案 0 :(得分:1)
一个非常简单的方法,无需使用DOM或(上帝禁止)正则表达式就是剥离标签并在三个新线上爆炸。
Strip标签将删除所有HTML并在其中留下空格。
$html = '<table id="table-1">
<tbody>
<tr><td><p>{{Phrase 1}}</p></td></tr>
</tbody>
</table>
<table id="table-2">
<tbody>
<tr><td><p>Sample text 1 goes here..</p></td></tr>
</tbody>
</table>
<table id="table-3">
<tbody>
<tr><td><p>{{Phrase 2}}</p></td></tr>
</tbody>
</table>
<table id="table-4">
<tbody>
<tr><td><p>Sample text 2 goes here..</p></td></tr>
</tbody>
</table>';
$arr = explode(PHP_EOL.PHP_EOL.PHP_EOL , strip_tags($html));
// Optional output. But the trim is needed so some
// kind of loop is needed to remove the extra spaces
For($i=1; $i<count($arr);){
Echo trim($arr[$i]) . "<Br>\n";
$i = $i+2;
}
答案 1 :(得分:1)
如果结构总是相同的,那么你可以在一个简单的正则表达式中完成:
// This regex matches the current structure, no matter what the number for the table id is
// and either Phrase 1 or 2.
$regex = '/(<table id="table-[0-9]+">[\s]+<tbody>[\s]+<tr><td><p>\{\{Phrase (1|2)\}\}<\/p><\/td><\/tr>[\s]+<\/tbody>[\s]+<\/table>)/';
$html = '<table id="table-1">
<tbody>
<tr><td><p>{{Phrase 1}}</p></td></tr>
</tbody>
</table>
<table id="table-2">
<tbody>
<tr><td><p>Sample text 1 goes here..</p></td></tr>
</tbody>
</table>
<table id="table-3">
<tbody>
<tr><td><p>{{Phrase 2}}</p></td></tr>
</tbody>
</table>
<table id="table-4">
<tbody>
<tr><td><p>Sample text 2 goes here..</p></td></tr>
</tbody>
</table>';
// Simply perform a replace with an empty string
$clean = preg_replace($regex, '', $html);
如果您想了解有关正则表达式的更详细说明,可以在此处阅读更多内容:https://regex101.com/r/B128DE/1