如果找到所选短语,则从html字符串中排除表单位

时间:2017-08-29 13:04:56

标签: php replace preg-replace

我将尝试用一个例子来解释这个问题。

我们说我有一个很大的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>';

2 个答案:

答案 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;
}

https://3v4l.org/gPQZn

答案 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://3v4l.org/4QHvm

如果您想了解有关正则表达式的更详细说明,可以在此处阅读更多内容:https://regex101.com/r/B128DE/1