【问题标题】:how to make a string lowercase without changing url如何在不更改 url 的情况下使字符串小写
【发布时间】:2011-09-13 08:29:54
【问题描述】:

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

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

【问题讨论】:

  • 如果您谈论的是网址,我认为大小写无关紧要。
  • 检查这个@Coding Freak - w3.org/tr/wd-html40-970708/htmlweb.html 它有效。
  • 您可能必须使用正则表达式,将 url 拉出并按顺序转换剩余部分,当您按顺序到达之前所在的位置时将 url 放回原处。
  • @Ash - 这就是我想要指出的。你读过网页的内容吗?

标签: php string mbstring


【解决方案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() 函数。此外,原始文本必须包含允许基于空格分隔符进行基本解析的内容。

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

【讨论】:

  • 当然,我不能为隐藏语义的字符串编写示例解析器。
  • 别问,别说。可应用于 php 字符串的语义并不多。
  • @kenansulayman:然后呢?这不是“把银盘上的完整解决方案交给我”类型的网站,重点是给提问者一个有用的答案,而不是为他做所有的工作。
  • 别打,别打。那是废话。如果您正在寻找赞成票,则不应仅仅因为您的答案未被接受而反对。它也有一个解析器(基于正则表达式),所以它的原理没有什么不同。可能它错过了一些需要 OP 理解的文档。但我不知道。
【解决方案2】:

你去吧,迭代,但尽可能好。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2011-02-20
  • 2021-05-02
  • 1970-01-01
  • 2012-06-16
  • 2018-03-11
  • 2013-01-11
相关资源
最近更新 更多