我想使用PHP的preg_replace()
来搜索某个单词出现的文本,并将该单词括在括号中,除非已经存在括号。这里的挑战是我想测试可能与我正在寻找的文本直接相邻的括号。
随机示例:我想将warfarin
替换为[[warfarin]]
Use warfarin for the prevention of strokes
Use [[warfarin]] for the prevention of strokes
(括号已存在)Use [[generic warfarin formulation]] for the prevention of strokes
(已存在“远程”括号)我可以使用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)
提前致谢!
答案 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" );
我假设在没有打开括号的情况下不会出现任何关闭括号的情况。