问题描述
我正在使用mb_strtolower将字符串转换为小写字母,但有时文本包含的URL均使用大写字母。当我使用mb_strtolower时,URL当然会更改并且无法正常工作。
如何在不更改网址的情况下将字符串转换为小写?
解决方法
由于您尚未发布字符串,因此只能一般回答。
每当在字符串上使用函数使其变为小写时,整个字符串都将变为小写。字符串函数只知道字符串,它们不知道这些字符串中具体写入的内容。
在您的方案中,您不想将我假设的整个字符串都小写。您只想小写该字符串的一部分,其他部分(URL)则不应更改。
为此,您必须首先将字符串解析为这两个不同的部分,我们将其称为“ 0”和“ 1”。然后,您只需要在文本类型的部分上应用小写功能。之后,您需要将所有部分按其原始顺序重新组合在一起。
如果字符串的内容在语义上很简单,则可以在空格处分割字符串。然后,您可以检查每个部分,如果它以
http://
或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是您的答案。 =)