CakePHP 1.3: способ удаления определенной строки из текста - функция PHP или регулярное выражение - PullRequest
0 голосов
/ 20 января 2012

Я перенес базу данных новостей на созданный мной новостной сайт CakePHP.У меня проблема с отображением текста из этих перенесенных новостей, потому что в тексте, который был импортирован в БД, были HTML-теги, управляющие текстом внутри них.

Может ли кто-нибудь помочь мне найти способ удалить эти тексты, не ставя под угрозу расположение тех же самых новостей?

По сути, я хотел бы выполнить следующее:

  1. Создайте функцию однократного использования, которую я могу включить в мой ArticlesController
  2. Например, имя функции будет function fixtext(){...}
  3. Когда я вызываю эту функцию из, скажем, 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('/');
}

Я не уверен, как подойти к этому, и как лучше.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Во-первых, я бы лично создал оболочку для выполнения этой задачи, так как это пакетное задание, и (в зависимости от количества задействованных записей) вы можете превысить ограничение времени ожидания запроса Apache. Кроме того, это хороший (забавный) опыт обучения, и оболочку можно расширить для выполнения будущих задач обслуживания.

Во-вторых, плохая идея - анализировать HTML с помощью (жадных) регулярных выражений из-за того, что он может быть искажен. Вместо этого безопаснее использовать HTML-парсер или использовать простые замены строк, но, если это небольшая обычная строка, которую можно безопасно сопоставить с шаблоном (т. Е. Вы не пытаетесь удалить закрытие </span> тегов), регулярные выражения могут работать.

Примерно так (не проверено):

// app/vendors/shells/article.php
<?php
/**
 * Maintenance tasks for Articles
 */
class Article extends Shell {
/**
 * Clean HTML in articles.
 */
    public function cleanHtml(){
        // safety kill switch (comment before running)
        $this->quit('Backup the `articles` table before running this!');
        // this query will time out if you have millions of records
        $articles = $this->Article->find('all', array(
            'fields' => array(
                'Article.name',
                'Article.body',
                'Article.id'
            ),
            'recursive' => -1,
        ));
        // loop and do stuff
        foreach ($articles as $article) {
            $this->out('Processing ' . $article['Article']['name'] . ' ... ');
            $article['Article']['body'] = $this->_removeInlineStyles($article['Article']['body']);
            $this->Article->id = $article['Article']['id'];
            $saved = $this->Article->saveField('body', $article['Article']['body']);
            $status = ($saved) ? 'done' : 'fail';
            $this->out($status);
        }
    }
/**
 * Removes inline CSS styles added by naughty WYSIWYG editors (or pasting from Word!)
 */
    protected function _removeInlineStyles($html) {
        $html = preg_replace('/ style="[^"']+"/gi', '', $html);
        return $html;
    }
}
1 голос
/ 20 января 2012

Вы можете использовать простой 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() для удаления каждого плохого свойства).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...