2

我正在使用 mb_strtolower 将字符串设为小写,但有时文本包含大写的 url。当我使用 mb_strtolower 时,网址当然会发生变化并且无法正常工作。

如何在不更改 URL 的情况下将字符串转换为较低的字符串?

4

2 回答 2

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 将是您的答案。=)

于 2011-06-12T09:38:02.983 回答
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()函数。此外,原始文本必须包含允许基于空格分隔符对其进行基本解析的内容。

希望这个示例可以帮助您与编码相处并理解您的问题。

于 2011-06-12T09:49:25.930 回答