我将新闻数据库迁移到我正在创建的CakePHP新闻网站。我在显示迁移的新闻中的文本时遇到问题,因为在导入到DB的文本中,有一些HTML标记用于控制其中的文本。
有没有人可以帮我找到一种方法来删除这些文本,而不会影响这些新闻的布局?
基本上,我想完成以下任务:
ArticlesController
function fixtext(){...}
http://mydomain.com/articles/fixtext
中调用此函数时,Article.body
列中所有受影响的行都将被扫描并修复。我要删除的文字部分是font-size: 12pt; line-height: 115%;
,位于<span>...</span>
标记内。
我有这样的想法,但我不确定如何实现它
function fixtext(){
$this->autoRender = 'FALSE';
$articles = $this->Article->find(
'all',
array(
'fields' => array(
'Article.body',
'Article.id'
),
'recursive' => -1
)
);
foreach($articles as $article){
// Per Dunhamzzz suggestion
$text = str_replace('font-size: 12pt; line-height: 115%;', '', $article['Article']['body']);
$this->Article->id = $article['Article']['id'];
$this->Article->saveField('Article.body', $text);
}
$this->redirect('/');
}
我不知道如何处理这个,以及最好的方法。
答案 0 :(得分:2)
首先,我个人创建一个shell来完成这个,因为它是一个批处理作业,并且(根据所涉及的记录数量)你可能会达到Apache的请求超时限制。此外,它是一个很好的(有趣的)学习体验,可以扩展shell以执行未来的维护任务。
其次,使用(贪婪)正则表达式解析HTML是bad idea,因为它可能是格式错误的。使用HTML parser或使用简单的字符串替换更安全,但是,如果它是一个小的常规字符串,可以安全地进行模式匹配(即,您没有尝试删除结束{ {1}}标签),正则表达式可以工作。
像这样(未经测试):
</span>
答案 1 :(得分:1)
您可以使用简单的str_replace()
来剪切该文本。
foreach($articles as $article){
$this->Article->saveField(
'Article.body' => str_replace('font-size: 12pt; line-height: 115%;', '', $article['Article']['body']),
'Article.id' => $article['Article']['id']
);
}
这是待定的,在每种情况下文本是相同的,否则你将需要一些更复杂的正则表达式(或可能多次str_replace()
调用删除每个不良属性)。