1

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

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

  1. 在这个字符串中:Use warfarin for the prevention of strokes
  2. 不在此字符串中:(Use [[warfarin]] for the prevention of strokes括号已存在)
  3. 也不这个字符串中:(Use [[generic warfarin formulation]] for the prevention of strokes'remote' 括号已经存在)

我可以使用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 的正则表达式断言必须有固定的长度,否则会很简单。

我正在使用

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

提前致谢!

4

2 回答 2

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;

将导致

原来的:

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

改变:

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

于 2012-05-20T09:54:55.680 回答
1

试试这个:

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

我假设没有左括号就不会出现任何右括号的情况。

于 2012-05-20T09:54:10.970 回答