я использую Библиотека PHPWord для замены некоторого текста-заполнителя в Word Doc через мое PHP-приложение.
Я должен разрешить пользователям загружать документы Word с некоторыми предопределенными заполнителями, например, $ {Anchor1} , $ {Anchor2} и т.п.
Теперь происходит то, что некоторые пользователи определяют заполнители как $ {Author1} и т.п.
Но SetValue работает в с учетом регистра манера.
Есть ли способ использовать замена без учета регистра через setValue в PHPWord
С уважением
Для этого нет предопределенной опции, но здесь вы можете сделать некоторые Обезьяна Ямочный.
Вы можете изменить исходный метод, но это не очень хорошая идея, потому что если вы обновите библиотеку до более новой версии, вы потеряете изменения.
Вместо этого вы можете создать свой собственный новый класс, который расширяет оригинальный, и добавить туда метод, который вызывает оригинальный setValue
НО он дублирует параметры, чтобы передать их как строчные, так и с заглавной буквы.
Вот мой подход. Я не мог попробовать, но я думаю, что это сработает (конечно, вы можете выбрать несколько лучших имен для класса и метода).
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'));
Других решений пока нет …