除非在括号内,否则PHP preg_replace替换文本

时间:2012-05-20 09:30:26

标签: php regex string-matching assertions replace

我想使用PHP的preg_replace()来搜索某个单词出现的文本,并将该单词括在括号中,除非已经存在括号。这里的挑战是我想测试可能与我正在寻找的文本直接相邻的括号。

随机示例:我想将warfarin替换为[[warfarin]]

  1. 在此字符串中:Use warfarin for the prevention of strokes
  2. 但此字符串中的Use [[warfarin]] for the prevention of strokes(括号已存在)
  3. 此字符串中的
  4. Use [[generic warfarin formulation]] for the prevention of strokes(已存在“远程”括号)
  5. 我可以使用lookbehind和lookahead断言来满足前两个要求:

    php > echo preg_replace( "/(?<!\[\[)(warfarin)(?!]])/", "[[$1]]", "Use warfarin for the prevention of strokes" );
    Use [[warfarin]] for the prevention of strokes
    php > echo preg_replace( "/(?<!\[\[)(warfarin)(?!]])/", "[[$1]]", "Use [[warfarin]] for the prevention of strokes" );
    Use [[warfarin]] for the prevention of strokes
    

    但是我需要你的第三个要求的帮助,即当存在“远程”括号时不添加括号:

    php > echo preg_replace( "/(?<!\[\[)(warfarin)(?!]])/", "[[$1]]", "Use [[generic warfarin formulation]] for the prevention of strokes" );
    Use [[generic [[warfarin]] formulation]] for the prevention of strokes
    

    在最后一个示例中,方括号应添加到单词warfarin,因为它包含在已包含在括号中的较长表达式中。

    问题是PHP的regexp断言必须有固定的长度,否则会非常简单。

    我正在使用

    PHP 5.3.10-1ubuntu3.1 with Suhosin-Patch (cli) (built: May  4 2012 02:20:36)
    

    提前致谢!

2 个答案:

答案 0 :(得分:2)

这就是我要做的。

$str = 'Use warfarin for the prevention of strokes. ';
$str .= 'Use [[warfarin]] for the prevention of strokes. ';
$str .= 'Use [[generic warfarin formulation]] for the prevention of strokes';
$arr = preg_split('/(\[\[.*?\]\])/',$str,-1,PREG_SPLIT_DELIM_CAPTURE);
// split the string by [[...]] groups
for ($i = 0; $i < count($arr); $i+=2) {
    // even indexes will give plain text parts
    $arr[$i] = preg_replace('/(warfarin)/i','[[$1]]',$arr[$i]);
    // enclose necessary ones by double brackets
}
echo '<h3>Original:</h3>' . $str;
$str = implode('',$arr); // finally join them
echo '<h3>Changed:</h3>' . $str;

将导致

  

原始

     

使用华法林预防中风。使用[[华法林]]预防中风。使用[[通用华法林制剂]]预防中风

     

更改:

     

使用[[华法林]]预防中风。使用[[华法林]]预防中风。使用[[通用华法林制剂]]预防中风

答案 1 :(得分:1)

试试这个:

echo preg_replace( "/(warfarin)([^\]]+(\[|$))/", "[[$1]]$2", "Use generic warfarin[[ formulation for]] the prevention of strokes\n" );

我假设在没有打开括号的情况下不会出现任何关闭括号的情况。