preg_replace () помощь в PHP - PullRequest
       16

preg_replace () помощь в PHP

1 голос
/ 30 апреля 2009

Рассмотрим эту строку

hello awesome <a href="" rel="external" title="so awesome is cool"> stuff stuff

Какое регулярное выражение я могу использовать, чтобы соответствовать любому вхождению awesome, которое не отображается в атрибуте title якоря?

Пока что это то, что я придумал (это не работает, к сожалению)

/[^."]*(awesome)[^."]*/i

Редактировать

Я принял совет Алана М и использовал регулярное выражение, чтобы перехватить каждое слово и отправить его в обратный вызов. Спасибо Алану М за твой совет. Вот мой окончательный код.

 $plantDetails = end($this->_model->getPlantById($plantId));

        $botany = new Botany_Model();
        $this->_botanyWords = $botany->getArray();
        foreach($plantDetails as $key=>$detail) {
            $detail = preg_replace_callback('/\b[a-z]+\b/iU', array($this, '_processBotanyWords'), $detail); 
            $plantDetails[$key] = $detail;  
        }

И _processBotanyWords () ...

   private function _processBotanyWords($match) {
        $botanyWords = $this->_botanyWords;  
        $word = $match[0];
        if (array_key_exists($word, $botanyWords)) {    
            return '<a href="' . PATH_BASE . 'articles/botany-words/#botany-word-' . str_replace(' ', '-', strtolower($word)) . '" title="' . trim($botanyWords[$word]) . '">' . $word . '</a>';
        } else {
            return $word;
        }
    }

Надеюсь, это поможет кому-нибудь еще когда-нибудь! Еще раз спасибо за все ваши ответы.

Ответы [ 4 ]

3 голосов
/ 30 апреля 2009

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

Просто используйте анализатор HTML.

2 голосов
/ 30 апреля 2009

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

Основная проблема заключается в том, что вы заменяете каждое ключевое слово, используя отдельный вызов preg_replace, эффективно обрабатывая весь текст снова и снова. Что вы должны сделать, это обработать текст один раз , сопоставляя каждое слово и ища его в вашем списке ключевых слов; если это в списке, замените его. Я не настроен на написание / тестирование PHP-кода, но вы, вероятно, хотите использовать preg_replace_callback:

$text = preg_replace_callback('/\b[A-Za-z]+\b/', "the_callback", $text);

"the_callback" - это имя функции, которая ищет слово и, если оно есть в списке, генерирует соответствующую ссылку; в противном случае возвращается совпадающее слово. Это может показаться неэффективным, обрабатывая каждое слово, как это, но на самом деле это намного более эффективнее, чем ваш первоначальный подход.

1 голос
/ 30 апреля 2009

Это так ужасно, что я не решаюсь опубликовать его, но если вам нужен быстрый взлом, решите проблему - вместо того, чтобы находить вещи, отличные от X, найдите вещи, которые IS , измените сделай это и верни обратно.

Это предполагает, что вы пытаетесь изменить классное (на "замечательное"). Если вы делаете что-то еще, отрегулируйте соответственно.

$string = 'Awesome is the man who <b>awesome</b> does and <a href="awesome.php" title="awesome">awesome</a> is.';

$string = preg_replace('#(title\s*=\s*\"[^"]*?)awesome#is', "$1PIGDOG", $string);

$string = preg_replace('#awesome#is', 'wonderful', $string);

$string = preg_replace('#pigdog#is', 'awesome', $string);

Не голосуй за меня. Я знаю, что это взлом.

1 голос
/ 30 апреля 2009

Конечно, использование библиотеки синтаксического анализа является промышленным решением, но у всех нас были времена, когда мы просто хотели написать что-то за 10 секунд и все было готово. В следующий раз, когда вы захотите обработать содержательный текст страницы, игнорируя теги, попробуйте сначала пропустить ввод через strip_tags . Таким образом, вы получите только простой, видимый текст, и ваши способности регулярных выражений снова будут безраздельно властвовать.

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