如何在不更改URL的情况下使字符串小写

时间:2011-06-12 09:29:43

标签: php string mbstring

我正在使用mb_strtolower将字符串设为小写,但有时文本包含大写的url。当我使用mb_strtolower时,网址当然会改变而不能正常工作。

如何在不使用changin网址的情况下将字符串转换为较低的字符串?

2 个答案:

答案 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,不应在其大小写中更改。

为此,您必须首先将字符串解析为这两个不同的部分,我们称之为textURLs。然后,您需要仅对文本类型的部分应用小写函数。之后,您需要按原始顺序将所有部件再次组合在一起。

如果字符串的内容在语义上很简单,则可以在空格处拆分字符串。然后,您可以检查每个部分,如果它以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()函数。此外,原始文本必须包含允许基于空格分隔符对其进行基本解析的内容。

希望这个例子可以帮助您更好地编写代码并理解您的问题。