1669 | 1666 | |
1670 | 1667 | // removed trailing [.,;:)] from URL |
1671 | 1668 | if ( in_array( substr($dest, -1), array('.', ',', ';', ':', ')') ) === true ) { |
1672 | 1669 | $ret = substr($dest, -1); |
1673 | 1670 | $dest = substr($dest, 0, strlen($dest)-1); |
1674 | 1671 | } |
2882 | | ! preg_match('/^[a-z0-9-]+?\.php/i', $url) ) |
2883 | | $url = 'http://' . $url; |
| 2886 | ! preg_match('/^[a-z0-9-]+?\.php/i', $url) ) { |
| 2887 | $url = 'http://' . $url; |
| 2888 | } |
| 2889 | |
| 2890 | $strip = array('%0d', '%0a', '%0D', '%0A'); |
| 2891 | $url = _deep_replace($strip, $url); |
| 2892 | |
| 2893 | $components = @parse_url( $url ); |
| 2894 | |
| 2895 | if ( ! $components ) { |
| 2896 | return ''; |
| 2897 | } |
| 2898 | |
| 2899 | // not sure why we are including \x80 - \xa0, but also am not sure how well the byte sequences will work with |
| 2900 | // UTF-8 characters since |
| 2901 | $allowed_chars = 'a-z0-9-~+_.!$&\'()*+,;=%\\x80-\\xff'; |
| 2902 | |
| 2903 | foreach( $components as $component => $val ) { |
| 2904 | $regex = false; |
| 2905 | $encode_brackets = false; |
| 2906 | |
| 2907 | switch( $component ) { |
| 2908 | case 'host': |
| 2909 | $regex = '|[^' . $allowed_chars . '%:\[\]]|i'; |
| 2910 | break; |
| 2911 | case 'path': |
| 2912 | $encode_brackets = true; |
| 2913 | $regex = '|[^' . $allowed_chars . '%/:@]|i'; |
| 2914 | break; |
| 2915 | case 'query': |
| 2916 | $encode_brackets = true; |
| 2917 | $regex = '|[^' . $allowed_chars . '%/:@?|i'; |
| 2918 | case 'fragment': |
| 2919 | $encode_brackets = true; |
| 2920 | $regex = '|[^' . $allowed_chars . '%/:@?]|i'; |
| 2921 | break; |
| 2922 | case 'scheme': |
| 2923 | case 'port': |
| 2924 | case 'user': |
| 2925 | case 'pass': |
| 2926 | break; |
| 2927 | } |
| 2928 | |
| 2929 | if ( $encode_brackets ) { |
| 2930 | $components[ $component ] = str_replace( '[', '%5B', $components[ $component ] ); |
| 2931 | $components[ $component ] = str_replace( ']', '%5D', $components[ $component ] ); |
| 2932 | } |
| 2933 | |
| 2934 | if ( $regex ) { |
| 2935 | $components[ $component ] = preg_replace( $regex, '', $components[ $component ] ); |
| 2936 | } |
| 2937 | |
| 2938 | } |
| 2939 | |
| 2940 | $url = ''; |
| 2941 | |
| 2942 | if ( isset( $components['scheme'] ) ) { |
| 2943 | $url .= $components['scheme'] . ':'; |
| 2944 | } |
| 2945 | |
| 2946 | if ( isset( $components['host'] ) ) { |
| 2947 | $url .= '//' . $components['host']; |
| 2948 | } |
| 2949 | |
| 2950 | if ( isset( $components['path'] ) ) { |
| 2951 | $url .= $components['path']; |
| 2952 | } |
| 2953 | |
| 2954 | if ( isset( $components['query'] ) ) { |
| 2955 | $url .= '?' . $components['query']; |
| 2956 | } |
| 2957 | |
| 2958 | if ( isset( $components['fragment'] ) ) { |
| 2959 | $url .= '#' . $components['fragment']; |
| 2960 | } else if ( $original_url[ strlen( $original_url ) - 1 ] === '#' ) { |
| 2961 | $url .= '#'; |
| 2962 | } |