Замена сложного шаблона с использованием функции PHP preg_replace, игнорирующей строки в кавычках - PullRequest
1 голос
/ 12 мая 2010

Рассмотрим следующую строку:

это строка, где некоторые ключевые слова Доступны. мне нужно отформатировать КЛЮЧЕВЫЕ СЛОВА от STRING '

В приведенной выше строке ключевыми словами являются STRING и WHERE

Теперь мне нужно получить следующий вывод:

this is a <b>STRING</b> <b>WHERE</b> some keywords ARE available. 'i need TO format the KEYWORDS from the STRING'

Так что вывод html будет таким:

это STRING WHERE некоторые ключевые слова Доступны. мне нужно отформатировать КЛЮЧЕВЫЕ СЛОВА от STRING '

Обратите внимание, что ключевые слова в кавычках ('...') будут игнорироваться. в приведенном выше примере я проигнорировал ключевое слово STRING в строке в кавычках.

Пожалуйста, предоставьте измененную версию следующего PHP сценария, чтобы я мог получить желаемый результат, как указано выше:

$patterns = array('/STRING/','/WHERE/');
$replaces = array('<b>STRING</b>', '<b>WHERE</b>');
$string   = "this is a STRING WHERE some keywords ARE available. 'i need TO format the KEYWORDS from the STRING'";
preg_replace($patterns, $replaces, $string);

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Это будет работать с вашим примером строки, но будут проблемы с более сложными строками, например с теми, которые содержат слова с апострофами. В любом случае, его можно использовать как отправную точку.

$keywords = array("STRING", "WHERE");
$regexp = '/(\'[^\']+\')|\b(' . implode('|', $keywords) . ')\b/e';
preg_replace($regexp, "strlen('\\2') ? '<b>\\2</b>' : '\\0'", $string);
0 голосов
/ 12 мая 2010

Попробуйте что-то вроде:

$keywords = array(
  'STRING' ,
  'WHERE' ,
  'KEYWORDS'
);
$keywordsRE = array();
foreach( $keywords as $w ) {
  $keywordsRE[] = '/\b('.$w.')\b/';
}
$string = "this is a STRING WHERE some keywords KEYWORDS ARE available. 'i need TO format the KEYWORDS from the STRING'";
$stringParts = explode( "'" , $string );
foreach( $stringParts as $k => $v ) {
  if( !( $k%2 ) )
    $stringParts[$k] = preg_replace( $keywordsRE , '<b>$1</b>' , $v );
}
$stringReplaced = implode( "'" , $stringParts );

Повторение одних и тех же ключевых слов (с одинаковыми изменениями) немного избыточно - использование Регулярного выражения позволяет применять эти же изменения (в данном случае, оборачивая совпадения в тегах <b></b>) для всех совпадений.

...