2017-07-30 17 views
0

私はPHPWordライブラリを使用して、Word Docの一部のテキストをPHPアプリケーション経由で置き換えます。PHPWord setValue大文字と小文字を区別しない置換

ユーザーは、事前定義されたプレースホルダを使用してWord文書をアップロードできるようにする必要があります。 $ {Anchor1}$ {ANCHOR2}など

は今何が起こるかは、一部のユーザーは$ {author1}など

しかしのsetValue作品に大文字と小文字を区別としてプレースホルダを定義しているあります方法。

PHPWord

でのsetValue経由 大文字小文字を区別しない代替を使用するには、いずれかの方法があります

よろしく

答えて

0

あり、そのための事前に定義されたオプションはありませんが、ここではあなたには、いくつかのMonkey Patchingを作ることができます。

ソースメソッドを変更することはできますが、ライブラリを新しいバージョンに更新すると変更が失われるため、これはお勧めできません。

代わりに、オリジナルのクラスを拡張する独自のクラスを作成し、オリジナルのメソッド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 TemplateProcessor('Template.docx'); 
$templateProcessor->setValue(array('city', 'street', 'City', 'Street'), array('Detroit', '12th Street', 'Detroit', '12th Street')); 
:実際にあなたがバックグラウンドでこれをやっている

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

関連する問題