我在textarea中使用TinyMCE编辑器。
当我试图保存从Word中插入编辑器的一些数据时,它会在表格单元格中添加一些额外的<p>
标记。
我也尝试用PHP preg_replace函数替换它:
$str = preg_replace('/<td.*><p>(.*?)<\/p><\/td>/', '<td>$1</td>', $string);
但它只取代了第一个,而不是全部。
HTML字符串示例:
<table width="652">
<tbody>
<tr>
<td colspan="2" width="652">
<p><strong>Test header</strong></p>
</td>
</tr>
<tr>
<td width="21">
<p>Nr.</p>
</td>
<td width="178">
<p><strong>Test2</strong></p>
</td>
</tr>
<tr>
<td rowspan="2" width="21">
<p>1</p>
</td>
<td rowspan="2" width="178">
<p>Test3</p>
</td>
</tr>
</tbody>
</table>
如您所见,有很多次像<td><p>*</p></td>
TinyMCE设置如下:
tinyMCE.init({
selector: selector,
readonly: <?= ($readonly == true)? 1 : 0 ?>,
height: 500,
theme: 'modern',
paste_auto_cleanup_on_paste : true,
paste_postprocess : function(pl, o) {
// remove extra line breaks
o.node.innerHTML = o.node.innerHTML.replace(/ /ig, " ");
},
plugins: [
'advlist autolink lists link image charmap print preview hr anchor pagebreak',
'searchreplace wordcount visualblocks visualchars code fullscreen',
'insertdatetime media nonbreaking save table contextmenu directionality',
'emoticons template paste textcolor colorpicker textpattern imagetools codesample toc'
],
toolbar1: 'undo redo | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | forecolor backcolor emoticons',
image_advtab: true,
statusbar: false,
setup: function (editor) {
editor.on('change', function () {
editor.save();
});
},
content_css: [
'//www.tinymce.com/css/codepen.min.css',
]
});
已更新
解决方案
$str = preg_replace('/<td.*?>.*?<p>(.*?)<\/p>.*?<\/td>/s', '<td>$1</td>', $string);
帮助,但还有另一个问题,即在每个html标记之后插入新行。我怎么能取代它?
答案 0 :(得分:1)
您的Regx无效,请改用此版本:<td.*>\n*<p>(.*?)<\/p>\n*<\/td>
答案 1 :(得分:1)
您也可以更改根块,请参阅:
https://www.tinymce.com/docs/configure/content-filtering/#forced_root_block
我认为这个设置可以做到:
forced_root_block : false
但我还没有测试过它。它也适用于所有内容,而不仅仅适用于表格中的单元格。它很容易测试,所以尝试一下就不会有问题。
我只是不喜欢使用regexp这样的东西,它太丑陋而且非常脆弱。
答案 2 :(得分:1)
您可以使用。*来解决多行字符串的问题。正则表达式上的/ s设置。
$str = preg_replace('/<td.*?>.*?<p>(.*?)<\/p>.*?<\/td>/s', '<td>$1</td>', $string);
现在只要模式仍然有效,它将跨越多条线
.*?
将匹配懒惰事物中的任何内容(包括新行)。
答案 3 :(得分:0)