PHPWord setValue不区分大小写的替换

时间:2017-07-30 11:04:16

标签: php case-sensitive case-insensitive phpword setvalue

我正在使用 PHPWord库通过我的PHP应用程序替换Word Doc中的一些占位符文本。

我必须允许用户使用一些预定义的占位符上传Word文档,例如 $ {Anchor1} $ {Anchor2} 等。

现在会发生一些用户将占位符定义为 $ {author1} 等。

setValue 区分大小写方式工作。

是否有任何方法可以通过PHPWord中的setValue使用不区分大小写的替换

此致

1 个答案:

答案 0 :(得分:0)

没有为此预定义的选项,但在这里您可以制作一些Monkey Patching

您可以修改源方法,但这不是一个好主意,因为如果您将库更新为较新版本,则会丢失更改。

除此之外,您可以创建一个扩展原始类的新类,并添加一个调用原始setValue的方法,但它会复制params以将它们传递给小写和大写。< / p>

这是我的方法。我无法尝试,但我认为它会起作用(当然,你可以为类和方法选择一些更好的名字)。

class TemplateProcessorCaseInsensitive extends TemplateProcessor
{
    public function setValueCaseInsensitive($search, $replace, $limit = self::MAXIMUM_REPLACEMENTS_DEFAULT)
    {
        if (is_array($search)) {
            foreach ($search as &$item) {
                $item = strtolower($item);
            }
            $capitalizedSearch = $search;
            foreach ($capitalizedSearch as &$capitalizedItem){
                $capitalizedItem = ucfirst($capitalizedItem);
            }
            $search = array_merge($search, $capitalizedSearch);
        }
        else{
            $search = array(strtolower($search), ucfirst(strtolower($search)));
        }

        if(is_array($replace)){
            $replace = array_merge($replace, $replace);
        }
        else{
            $replace = array($replace, $replace);
        }

        $this->setValue($search, $replace, $limit);
    }
}

让我们看一些例子!

示例1

如果你这样做:

$templateProcessor = new TemplateProcessorCaseInsensitive ('Template.docx');
$templateProcessor->setValueCaseInsensitive('Name', 'John Doe');

实际上你是在后台这样做的:

$templateProcessor = new TemplateProcessor('Template.docx');
$templateProcessor->setValue(array('name', 'Name'), array('John Doe', 'John Doe'));

示例2

如果你这样做:

$templateProcessor = new TemplateProcessorCaseInsensitive ('Template.docx');
$templateProcessor->setValueCaseInsensitive(array('City', 'Street'), array('Detroit', '12th Street'));

实际上你是在后台这样做的:

$templateProcessor = new TemplateProcessor('Template.docx');
$templateProcessor->setValue(array('city', 'street', 'City', 'Street'), array('Detroit', '12th Street', 'Detroit', '12th Street'));