我正在使用mb_strtolower将字符串设为小写,但有时文本包含大写的url。当我使用mb_strtolower时,网址当然会改变而不能正常工作。
如何在不使用changin网址的情况下将字符串转换为较低的字符串?
答案 0 :(得分:1)
这里你去,迭代,但尽可能好。
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将是你的答案。 =)
答案 1 :(得分:1)
由于您尚未发布字符串,因此通常只能回答这个问题。
每当您对字符串使用函数使其为小写时,整个字符串将变为小写。字符串函数只知道字符串,它们不知道这些字符串中特定的内容。
在您的场景中,您不希望小写我假设的整个字符串。您希望仅小写该字符串的一部分,其他部分,URL,不应在其大小写中更改。
为此,您必须首先将字符串解析为这两个不同的部分,我们称之为text
和URLs
。然后,您需要仅对文本类型的部分应用小写函数。之后,您需要按原始顺序将所有部件再次组合在一起。
如果字符串的内容在语义上很简单,则可以在空格处拆分字符串。然后,您可以检查每个部分,如果它以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()
函数。此外,原始文本必须包含允许基于空格分隔符对其进行基本解析的内容。
希望这个例子可以帮助您更好地编写代码并理解您的问题。