文字列を小文字にするためにmb_strtolowerを使用していますが、テキストに大文字のURLが含まれている場合があります。そして、mb_strtolowerを使用すると、もちろんURLが変更され、機能しなくなります。
URLを変更せずに文字列を下位に変換するにはどうすればよいですか?
文字列を投稿していないため、これは一般的にしか回答できません。
文字列を小文字にする関数を使用すると、文字列全体が小文字になります。文字列関数は文字列のみを認識し、これらの文字列内に記述された内容を特に認識しません。
あなたのシナリオでは、私が想定している文字列全体を小文字にしたくありません。その文字列の一部のみを小文字化し、他の部分、URL は大文字と小文字を変更しないでください。
そのためには、まず文字列をこれら 2 つの異なる部分に解析する必要があります。それらtext
を と と呼びましょうURLs
。次に、タイプテキストの部分にのみ小文字関数を適用する必要があります。その後、すべてのパーツを元の順序で再び組み合わせる必要があります。
文字列の内容が意味的に単純な場合は、文字列をスペースで分割できます。http://
次に、各部分がor https://
( ?)で始まるかどうかを確認し、そうでis_url()
ない場合は小文字の操作を実行します。
$text = 'your content http://link.me/now! might differ';
$fragments = explode(' ', $text);
foreach($fragments as &$fragment) {
if (is_not_url($fragment))
$fragment = strtolower($fragment) // or mb_strtolower
;
}
unset($fragment); // remove reference
$lowercase = implode(' ', $fragments);
このコードを機能させるには、is_not_url()
関数を定義する必要があります。さらに、元のテキストには、スペース区切りに基づいて基本的な解析を行うことができるコンテンツが含まれている必要があります。
この例が、コーディングと問題の理解に役立つことを願っています。
ほら、繰り返しますが、可能な限り細かくします。
function strtolower_sensitive ( $input ) {
$regexp = "#((http|https|ftp)://(\S*?\.\S*?))(\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)#ie";
if(preg_match_all($regexp, $input, $matches, PREG_SET_ORDER)) {
for( $i=0, $hist=array(); $i<=count($matches); ++$i ) {
str_replace( $u=$matches[$i][0], $n="sxxx".$i+1, $input ); $hist[]=array($u,$n);
}
$input = strtolower($input);
foreach ( $hist as $h ) {
str_replace ( $h[1], $h[0], $input );
}
}
return $input;
}
$input は文字列で、$output は答えになります。=)