使用PHP preg_replace函数忽略引用字符串的复杂模式替换

时间:2010-05-12 05:21:13

标签: php string replace preg-replace design-patterns

请考虑以下字符串:

  

这是STRING WHERE一些关键字   可用。 '我需要格式化   来自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 个答案:

答案 0 :(得分:2)

这将适用于您的字符串示例,但是更复杂的字符串会出现问题,例如包含带撇号的单词。无论如何,它可以作为一个起点。

$keywords = array("STRING", "WHERE");
$regexp = '/(\'[^\']+\')|\b(' . implode('|', $keywords) . ')\b/e';
preg_replace($regexp, "strlen('\\2') ? '<b>\\2</b>' : '\\0'", $string);

答案 1 :(得分:0)

尝试类似:

$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>标记中的匹配包装)应用于所有匹配。 / p>