解決策は、先読みと後読みを調べることでした-置換を行ったときに置換が互いに食べられたため、RegExのLookAroundsの概念は私の問題を解決するのに役立ちました
そのため、私たちは古いプロジェクトのいくつかを移行するためにしばらく取り組んでおり (おそらく悪い/古いコーディング習慣)、それらを php7 対応にするために取り組んでいます。このプロセスでは、プロジェクトの .php ファイルでいくつかの調整を行ったので、たとえば
当面の問題は、php 文字列関数 (strlen、substr など) のデンマーク語文字に関するいくつかの問題に直面しており、代わりに mb_string 関数を使用したいということです。「オーバーロード」機能を使用してインターネットで読むことができるものから、行く方法ではないため、ファイルベースの検索を置き換えることにしました。
私の検索置換関数は現在このようになっています(@SeanBrightのおかげで更新されました)
$testfile = file_get_contents($file);
$array = array ( 'strlen'=>'mb_strlen',
'strpos'=>'mb_strpos',
'substr'=>'mb_substr',
'strtolower'=>'mb_strtolower',
'strtoupper'=>'mb_strtoupper',
'substr_count'=>'mb_substr_count',
'split'=>'mb_split',
'mail'=>'mb_send_mail',
'ereg'=>'mb_ereg',
'eregi'=>'mb_eregi',
'strrchr' => 'mb_strrchr',
'strichr' => 'mb_strichr',
'strchr' => 'mb_strchr',
'strrpos' => 'mb_strrpos',
'strripos' => 'mb_strripos',
'stripos' => 'mb_stripos',
'stristr' => 'mb_stristr'
);
foreach($array as $function_name => $mb_function_name){
$search_string = '/(^|[\s\[{;(:!\=\><?.,\*\/\-\+])(?<!->)(?<!new )' . $function_name . '(?=\s?\()/i';
$testfile = preg_replace($search_string, "$1".$mb_function_name."$2$3", $test,-1,$count);
}
print "<pre>";
print $test;
$file の内容は次のとおりです。
<?php
print strtoupper('test');
print strtolower'test');
print substr('tester',0,1);
print astrtoupper('test');
print bstrtolower('test');
print csubstr(('tester',0,1);
print [substr('tester',0,1)];
print {substr('tester',0,1)};
substr('test',0,1);
substr('test',0,1);
(substr('test',0,1));
!substr();
if(substr()==substr()=>substr()<substr()){
?substr('test');
}
"test".substr('test');
'asd'.substr('asd');
'asd'.substr('asd');
substr( substr('asdsadsadasd',0,-1),strlen("1"),strlen("100"));
substr (substr ('Asdsadsadasd',0,-1), strlen("1"), strlen("100"));
substr(substr(substr('Asdsadsadasd',0,-1),0,-1), strlen("1"), strlen("100"));
mailafsendelse(substr('asdsadsadasd',0,-1), strlen("1"), strlen("100"));
mail(test);
substr ( tester );
substr ( tester );
mail mail mail mail ( tester );
$mail->mail ();
$mail -> mail ();
new Mail();
new mail ();
strlen ( tester )*strlen ( tester )+strlen ( tester )/strlen ( tester )-strlen ( tester )
;
ここでのポイントは、実際の php コードが有効な構文である必要はないということです。さまざまなシナリオで機能させたかっただけです
私の正規表現の問題は、この行の理由がわからないことです:
substr(substr(substr('Asdsadsadasd',0,-1),0,-1), strlen("1"), strlen("100"));
動かない。1 番目と 3 番目の substr は正しく置き換えられますが、2 番目は次のようになります。
mb_substr(substr(mb_substr('Asdsadsadasd',0,-1),0,-1), mb_strlen("1"), mb_strlen("100"));
注意として、私の検索文字列は、関数名の前にあるあらゆる種類の文字で機能するように作成されており、関数名の後の文字は「(」である必要があります
完璧な世界では、クラスのメソッドである文字列関数も除外したいと思います。たとえば、電子メールを送信する $order->mail() です。これを $order->mb_send_mail() に変換したくありません
私の理解では、すべてのパラメーターは同じであるため、問題にはなりません。
完全なスクリプトはここにあり ます https://github.com/welracid/phpStringToMBString