как сделать строчную строчную без изменения URL - PullRequest
2 голосов
/ 12 июня 2011

Я использую mb_strtolower, чтобы сделать строку строчной, но иногда текст содержит URL-адреса с заглавной буквы.И когда я использую mb_strtolower, конечно, URL меняются и не работают.

Как преобразовать строку в нижнюю без изменения URL?

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Так как вы не опубликовали свою строку, на это можно ответить только в общем случае.

Всякий раз, когда вы используете функцию для строки, чтобы сделать ее строчной, вся строка будет сделана строчной.Строковые функции осведомлены только о строках, они не знают о содержимом, специально написанном в этих строках.

В вашем сценарии вы не хотите использовать строчную букву для всей строки, которую я предполагаю.Вы хотите, чтобы строчные буквы были только частями этой строки, другие части, 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().Кроме того, исходный текст должен содержать содержимое, позволяющее работать с элементарным синтаксическим анализом на основе разделителя пробелов.

Надеемся, этот пример поможет вам освоиться с кодированием и пониманием вашей проблемы.

1 голос
/ 12 июня 2011

Вот, пожалуйста, итеративно, но настолько хорошо, насколько это возможно.

    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 - ваш ответ.=)

...